一、哈希函数的定义
【注】哈希值是固定长度的,哈希函数H是公开的。
hash函数到底长什么样子?我们用一个简单的hash函数举例:
是一个长消息,设,其中为长的比特串,定义哈希函数H如下
解释一下这个简单的哈希函数,先把消息M分成k组,每组都是l长,那么哈希函数是进行异或运算的,得到的结果也必然是l长。这样无论多长的M消息,都能通过这个哈希函数生成固定长度的哈希值。
二、哈希函数的功能
(1)最重要的功能
数据完整性检验:哈希函数可以用于验证数据是否被修改。当数据被哈希后,如果数据的任何部分发生变化,重新计算的哈希值也会随之变化。因此,可以通过比较哈希值来判断数据的完整性。
对上图做出解释:当一份数据首次被创建或接收时,会使用哈希函数计算出该数据的哈希值。这个哈希值就像是数据的一个指纹。计算出来的哈希值会被记录下来,通常与数据分开存储或传输,以防止篡改。当数据被再次使用或从远程位置下载时,接收者会重新计算数据的哈希值,并将其与之前记录的哈希值进行比较。
如果两个哈希值匹配,这表明数据自第一次计算哈希值以来没有被篡改过,因此数据的完整性得到了验证。如果哈希值不匹配,则意味着数据可能已经被修改,或者在传输过程中发生了错误,这时数据的完整性被认为受到了破坏。
(2)其他功能
① 密码存储
在用户身份验证系统中,用户的密码通常不是以明文形式存储,而是存储其哈希值。当用户登录时,系统对输入的密码进行哈希并与存储的哈希值进行比较,以验证用户的身份。
② 数字签名
数字签名利用哈希函数将长消息压缩为较短的哈希值,然后使用私钥对该哈希值进行加密。这保证了消息的完整性和来源的真实性,因为只有拥有正确私钥的人才能生成有效的数字签名。
三、哈希函数满足条件及安全性定义
(1)哈希函数需要满足以下这些条件
- hash函数的输入可以是任意长
- hash函数的输出是固定长
- 输入中的微小变化,也会导致哈希值显著改变(雪崩效益)
- 易于在软件和硬件实现
- 相同的输入总是得到相同的输出(确定性)
(2)哈希函数需要满足的安全条件
- 单向性:已知,求较为容易;但是,已知,求使得的在计算上是不可行的。
- 抗弱碰撞性:已知,找出使得在计算上是不可行的。
- 抗强碰撞性:找出任意两个不同的输入、,使得在计算上是不可行的。
从安全性的角度来说,单向性是最基础(最弱)的安全属性,抗强碰撞是最强的要求,它隐含了抗弱碰撞和单向性的安全性。换句话说,如果一个哈希函数是抗强碰撞的,那么它自然也是抗弱碰撞的和单向的。但是,反之则不一定成立;即,一个满足单向性和抗弱碰撞的哈希函数可能并不满足抗强碰撞性。
四、哈希函数与加密算法的关联
哈希函数虽然经常与加密算法一起讨论,并且在很多安全相关的应用中发挥着关键作用,但哈希函数本身并不是一种加密算法。
特征 | 加密算法 | 哈希函数 |
---|---|---|
可逆性 | 双向的,数据可以通过加密算法加密,再通过解密算法恢复原始数据。 | 单向的,从产生的哈希值几乎不可能反向计算出原始数据。 |
目的 | 保护数据隐私,确保数据不会被未经授权的第三方读取。 | 验证数据完整性和一致性,检测数据是否被篡改。 |
输出 | 输出长度可变,依据加密模式和密钥长度。 | 输出长度固定,不论输入数据长度如何。 |
安全性属性 | 需要保证数据的机密性。 | 需要满足抗碰撞性、预像抵抗性和二次预像抵抗性等安全属性。 |