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

目录:

目录:

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

[1.1 如何验证文件是否被修改过](#1.1 如何验证文件是否被修改过)

[1.2 单项散列函数:](#1.2 单项散列函数:)

二、单向hash抗碰撞

[2.1 弱抗碰撞(Weak Collision Resistance)](#2.1 弱抗碰撞(Weak Collision Resistance))

[2.2 强抗碰撞(Strong Collision Resistance)](#2.2 强抗碰撞(Strong Collision Resistance))

[2.3 安全性问题](#2.3 安全性问题)

[2.4 当前推荐使用的哈希函数](#2.4 当前推荐使用的哈希函数)

三、单向hash应用场景

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

[3.2 口令加密:](#3.2 口令加密:)

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

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

[3.5 数字签名和非对称加密:](#3.5 数字签名和非对称加密:)

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

四、常用hash算法

[4.1 MD5:](#4.1 MD5:)

[4.2 SHA1:](#4.2 SHA1:)

[4.3 SHA2:](#4.3 SHA2:)

[4.4 SHA-256:](#4.4 SHA-256:)

[4.5 SHA3:](#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位长的哈希值,主要应用在中国的安全系统和产品中。

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

相关推荐
厨 神2 分钟前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0667 分钟前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
迷迭所归处8 分钟前
C++ —— 关于vector
开发语言·c++·算法
geek_Chen019 分钟前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
leon62537 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林38 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
(⊙o⊙)~哦40 分钟前
linux 解压缩
linux·运维·服务器
Navigator_Z1 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼1 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
天玑y2 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯