【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录:

目录:

一、什么是单项散列函数?

1.1 如何验证文件是否被修改过

 1.2 单项散列函数:

二、单向hash抗碰撞

        2.1 弱抗碰撞(Weak Collision Resistance)

        2.2 强抗碰撞(Strong Collision Resistance)

        2.3 安全性问题

        2.4 当前推荐使用的哈希函数

三、单向hash应用场景

3.1  文件完整性(检查下载的软件是否被篡改):

3.2 口令加密:

3.3 消息认证(确保消息未被篡改):

3.4 伪随机数生成器(PRNG):

3.5 数字签名和非对称加密:

3.6 比特币的工作量证明(Proof of Work, PoW):

 四、常用hash算法

4.1 MD5:

4.2 SHA1:

4.3 SHA2:

4.4 SHA-256:

4.5 SHA3:


一、什么是单项散列函数?

1.1 如何验证文件是否被修改过

文件首次创建或被认为是处于可信状态时,这个已存储的文件在传输文件过程中由于安全性原因可能会中途被攻击者篡改信息,当我们拿到文件后如何知道信息是否被篡改保证信息的安全性呢?

这里我们首先将已存储的文件先做一个已存储文件副本,当我们已存储文件传输到我们这里时,我们想要知道信息是否完整,我们可以通过与之前的已存储文件副本进行比对校验确认完整性

已存储文件在形成已存储文件副本和传输文件时,我们可以认为这个过程的安全性都是相同的,都是有可能篡改的,而且在形成与校验过程中开销相对来说也是比较大的

指纹代替文件比对将已存储文件形成一个指纹文件,指纹文件比较小,对于指纹文件的安全管理相对变得容易,而且开销也相对文件来说会小很对

我们可以用一台可信服务器来放我们的安全属性,这样安全保存的成本更低,获取指纹的开销也比较小。

 

这里指纹需要满足的特点:计算开销小、存储空间开销小、已存储文件改变之后指纹文件跟着改变

 1.2 单项散列函数:

根据指纹所需要满足的特点,解决这样的问题,我们就用到的单项散列函数

单项散列函数也称为哈希函数是一种从输入数据(通常称为“消息”)生成固定大小输出(通常称为“哈希值”或“哈希码”)的算法。单向散列函数的关键特性之一是它们的单向性和抗碰撞性,这意味着从哈希值反推原始数据是非常困难的,并且找到两个不同的输入数据,使其产生相同的哈希值也非常困难。

(1)任意长度数据 => 固定长度散列:无论输入数据的大小或长度如何,哈希函数都会输出一个固定长度的哈希值。这使得哈希函数非常适用于处理大型数据集

(2)减少匹配开销通过比较两个哈希值,而不是两个完整的数据集,可以大大减少匹配开销。这在比如文件完整性检查、数据库索引创建等场景中非常有用。

(3)快速计算:哈希函数通常设计得非常高效,可以快速计算出输入数据的哈希值。

(4)快速验证:由于哈希值的固定大小,验证哈希值比验证原始数据更快更简单。

(5)消息变化=>散列值变化:哈希函数的另一个关键特性是,即使输入数据的微小变化也会导致哈希值的大幅度变化。这就意味着,如果文件或消息被修改,哈希值也会改变,从而可以通过比较哈希值来检测修改。

(6)验证修改:通过对比文件或消息的原始哈希值和新的哈希值,可以验证它们是否被修改过。

(7)单向不可逆:从哈希值无法(或至少在计算上不可行)反推出原始输入数据,这是哈希函数的关键安全特性之一。

(8)抗碰撞:找到两个不同的输入,它们产生相同的哈希值是非常困难的。这称为哈希函数的抗碰撞性。这是哈希函数在众多用途,如密码学、数据完整性校验等方面的关键属性。

二、单向hash抗碰撞

2.1 弱抗碰撞(Weak Collision Resistance)

弱抗碰撞是指对于一个给定的输入 𝑥,很难找到另一个不同的输入 x′,使得 𝑥≠𝑥′ 且 ℎ(𝑥)=ℎ(𝑥′)。换句话说,给定一个特定的哈希值,很难找到另一个不同的输入,使得它们的哈希值相同

2.2 强抗碰撞(Strong Collision Resistance)

强抗碰撞是指很难找到任意两个不同的输入 𝑥和 𝑥′,使得 𝑥≠𝑥′且 ℎ(𝑥)=ℎ(𝑥′)。换句话说,找到任何两个具有相同哈希值的不同输入是非常困难的。

2.3 安全性问题

  • MD5:MD5是一种广泛使用的哈希函数,但由于其设计上的缺陷,已经证明不再具有强抗碰撞性。这意味着可以找到两个不同的输入,它们具有相同的MD5哈希值。因此,MD5不再被推荐用于需要高安全性的应用,如数字签名。

  • SHA-1:SHA-1也是一种曾经广泛使用的哈希函数。然而,由于密码学分析的进展,SHA-1的强抗碰撞性也被攻破。虽然找到实际的碰撞需要大量的计算资源,但这已经表明SHA-1不再安全。因此,SHA-1也不再被推荐用于需要高安全性的应用。

2.4 当前推荐使用的哈希函数

为了确保安全性,推荐使用更现代的哈希函数,如SHA-256、SHA-3等。这些哈希函数目前被认为是安全的,具有良好的抗碰撞性。

三、单向hash应用场景

3.1  文件完整性(检查下载的软件是否被篡改):

通过比如 MD5, SHA1 或 SHA256 等散列算法来验证文件的完整性。下载文件时通常会提供一个哈希值,用户可以通过计算下载文件的哈希值并与提供的哈希值进行比较来确保文件未被篡改

3.2 口令加密:

口令应通过哈希函数进行存储,而非明文。为增加安全性,常与加盐技术(salt)结合使用,这样即使两个相同的密码,由于加盐不同,其最终的哈希值也会不同。常用的哈希算法包括 bcrypt, PBKDF2 或 Argon2。

3.3 消息认证(确保消息未被篡改):

HMAC(Hash-based Message Authentication Code)是一种基于密钥的哈希算法,用于验证消息的完整性和真实性。它结合了哈希函数和一个密钥,只有知道密钥的人才能验证哈希值,从而确保消息的安全。

3.4 伪随机数生成器(PRNG):

在密码学中,高质量的伪随机数对于生成安全的密钥和密码非常重要。PRNG应具备高熵(随机性)以确保产生的数值不可预测。

3.5 数字签名和非对称加密:

通过使用非对称加密技术,可以生成数字签名来验证一个消息或文件的真实性和完整性。发送者使用私钥签名,接收者则可以用相应的公钥来验证签名。

3.6 比特币的工作量证明(Proof of Work, PoW):

这是一种共识机制,用于在没有中央权威的情况下达成网络共识。它要求参与者解决一个计算密集型的问题,解决问题的过程需要大量的计算资源,这样可以防止恶意攻击和垃圾交易。

 四、常用hash算法

4.1 MD5

MD5(Message-Digest Algorithm 5)已经不再被视为安全的哈希函数,因为它的碰撞抵抗性较弱,即存在两个不同的输入可能产生相同的输出的情况。然而,它仍然广泛用于非加密目的的数据完整性检查。

4.2 SHA1

安全哈希算法1(SHA-1)比MD5更安全,但是同样因为碰撞抵抗性较弱而不再建议用于密码学哈希。

4.3 SHA2

SHA-2是一组哈希函数,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224和SHA-512/256等。SHA-256、SHA-384和SHA-512分别输出256位、384位和512位长的哈希值,被广泛应用在安全协议和系统中。

4.4 SHA-256

SHA-256是应用最广泛的SHA-2函数,比特币的工作量证明(PoW)就是采用的SHA-256哈希函数。

4.5 SHA3

SHA-3(Keccak)是SHA-2的后续版本,采用全新的设计。Keccak256(256位长的SHA-3版本)用于以太坊中生成地址和交易哈希

4.6 国密SM3

SM3是中国国家密码管理局推出的密码哈希函数标准,输出256位长的哈希值,主要应用在中国的安全系统和产品中。

尽管哈希函数的输出看起来是随机的,但它们都是确定性的:同一输入总是产生相同的输出。而安全的哈希函数还应具有以下性质:碰撞抵抗(难以找到两个不同输入产生相同输出)、预图像抵抗(给定哈希值难以找到对应的输入)和次预图像抵抗(给定输入难以找到另一输入产生相同的输出)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像边缘检测中Sobel算子的原理,并附OpenCV和Matlab的示例代码

Sobel算子是一种用于图像边缘检测的离散微分算子。它结合了图像的平滑处理和微分计算,旨在强调图像中强度变化显著的区域,即边缘。Sobel算子在图像处理中被广泛使用,特别是在计算机视觉和图像分析领域。 Sobel算子的原理 Sobel算子主要用于计…

大模型入门(一)—— LLaMa/Alpaca/Vicuna

LLaMa模型是Meta开源的大模型,模型参数从7B到65B不等,LLaMa-7B在大多数基准测试上超过了GPT3-173B,而LLaMa-65B和Chinchilla-70B、PaLM-540B相比也极具竞争力。相比于ChatGPT或者GPT4来说,LLaMa可能效果上还有差距,但相…

HyperBDR云容灾,让低碳未来有“迹”可循

全球气候变化时刻牵动着我们的心。生活在同一个地球下,万博智云始终坚持环境友好,携手企业和合作伙伴在保持市场竞争力、促进企业可持续发展的同时,共同肩负起守护地球环境的责任。 HyperBDR云容灾以“碳足迹”践行低碳容灾 云产品及数据中心…

Qt界面假死原因

创建一个播放器类,继承QLabel,在播放器类中起一个线程用ffmpeg取流解码,将解码后的图像保存到队列,在gui线程中调用update()刷新显示。 当ffmpeg打开视频流失败后调用update()将qlabel刷新为黑色,有一定概率会使得qla…

随机采样一致性算法RANSAC

点云分割 图自:https://openaccess.thecvf.com/content_cvpr_2017/papers/Qi_PointNet_Deep_Learning_CVPR_2017_paper.pdf《PointNet:用于3D分类和分割的点集深度学习》 点云分割(Point Cloud Segmentation)是计算机视觉和3D图像处理中的一个重要步骤,…

数据结构——位图布隆过滤器

一、位图 1.1 概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以…

Android获取当前屏幕显示的是哪个activity

在 Android 中,要获取当前屏幕显示的 Activity,可以使用以下几种方法: 方法一:使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法,尽管从 Android 5.0 (API 21) 开始,有些方法变得不太可靠…

log4js node日志插件

最近不是特别忙在用express搭建后台项目,在开发过程中遇到了需要输入日志的问 本来想直接用node自带的console来实现,后来发现console输出的日志达不到自己希望的 日志格式,后来各种百度发现了log4js插件,本文来记录log4js插件使用…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现:实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

基于zynq的视频采集与hdmi显示(未完)

文章目录 一、项目整体框架一、传感器配置与驱动二、IMX222 1080P 模式图像解析(bayer 2 rgb 模块)2.1 解析有效像素(gen_sync)2.1.1同步字详细介绍: 2.2 bayer 2 rgb 一、项目整体框架 一、传感器配置与驱动 camera信息:索尼IMX222摄像头 SPI&#xf…

Android10.0 锁屏分析-KeyguardPatternView图案锁分析

首先一起看看下面这张图: 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来,并添加到界面上的。 我们知道,Pattern锁所使用的layout是 R.layout.keyguard_pattern_view&a…

【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【机器学习】Grid Search: 一种系统性的超参数优化方法

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Grid Search: 一种系统性的超参数优化方法引言什么是Grid Search?Gr…

Spring Boot(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )

目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一:使用 IDEA 直接创建项目 项目创建方式二:使用Spring Initializr 的 Web页面创建项目 (了解&#x…

Java学习高级四

JDK8开始,接口新增了三种形式的方法 接口的多继承 内部类 成员内部类 静态内部类 局部内部类 匿名内部类 import javax.swing.*; import java.awt.event.ActionEvent;public class Test {public static void main(String[] args) {// 扩展 内部类在开发中的真实使用…

深度学习LSTM之预测光伏发电

代码一:训练LSTM模型 代码逐段分析 import numpy as np import pandas as pd import tensorflow.keras as tk from tensorflow.keras import layers首先,导入了必要的库:numpy用于数值计算,pandas用于数据处理,tenso…

【C++】多态进阶

标题:【C】多态进阶 水墨不写bug 目录 (一)多态的原理 (1)虚函数表 (2)多态的原理 (3)动态绑定与静态绑定 (一)多态的原理 (1&am…

windows 11 PC查询连接过的wlan密码

1:管理员打开cmd 2:输入netsh wlan show profiles 3:netsh wlan show profiles Shw2024-5G keyclear 密码关键内容:12345678

[Unity]碰撞器的接触捕获层详解

目录 前言※关闭效果器(Effector)的遮罩接触捕获层的官方描述官方描述的翻译和注解接触捕获层作用简介接触(Contact)和捕获(Capture)配置接触捕获层的作用※接触捕获层对碰撞响应的影响需要接触捕获的物理查询需要接触捕获的物理回调注意运行时(Runtime)修改接触的相互性总结 相…

【Git分支管理】理解分支 | 创建分支 | 切换分支 | 合并分支 | 删除分支 | 强制删除分支

目录 前言 0.理解分支 1.查看本地仓库存在的分支 2.HEAD指向分支 3.创建本地分支 4.切换分支 5.分支提交操作 6.合并分支 快进模式Fast-forward 7.删除分支 8.强制删除分支 本篇开始介绍下Git提供的杀手级的功能:分支管理 先提交再合并 前言 在玄幻武侠…