Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说密码体系五 - 散列函数,希望能够帮助你!!!。
在开篇的时候,我们说过密钥体系主要解决三个问题:
我们前面介绍的对称密码和非对称密码解决的是机密性,也就是确保 Eve 即便截获到密文,也无法猜测出 Alice 和 Bob 传递的是啥内容。
但有的时候,Eve 并非需要激活成功教程消息。 比如 Alice 辛辛苦苦写了一个程序,Eve 晚上偷偷在程序后面追加了一些代码。 第二天 ALice 将被替换的程序发给了 Bob。 虽然 Eve 没有截获任何密钥,但事实上也破坏了 Alice 和 Bob 之间的信任关系。
所以密钥体系仍然需要解决完整性,即第三者无法篡改原文内容。
本文我们将介绍第一种方式: 散列函数。
散列函数是一个单向计算函数,只有一个输入和对应的输出。f(x)=y
其中x称为消息, 而y则称为散列值。 f(x)=y可以跟进消息内容计算出对应的散列值,而我们就可以通过散列值来检查信息的完整性。
并不是什么数学函数都可以当作散列函数的, 想要成为一个合格工业级散列函数,必须具备以下特征:
无论x是多长的消息,单向散列函数必须能够生成固定长度的y(散列值)。比如SHA-256它所计算出来的散列值永远是 256 比特。
当然快是相对的,尽管随着x的变大,计算时间势必会加长。但如果不能在现实的时间内计算出来,那么就丧失实际应用的价值了。
散列值的唯一性称之为抗碰撞性。也就是只要x不同那么计算出来的y一定不能相同。抗碰撞性分为两类: 强抗碰撞性和弱抗碰撞性
弱抗碰撞性指的是x确定,那么y也就确定。 此时找到一个散列值等于y的x是非常困难的
和弱抗碰撞性对应的是强抗碰撞性。强抗碰撞性指的是在茫茫数据集中,指定任意一个y,找到 x 和 x' 是非常困难的
一个合格的散列函数,必须同时具备强抗碰撞性和弱抗碰撞性。
根据x可以计算出y,但无法根据y反推出x。
在一些场合中,单向散列函数也称之为"消息摘要函数"、"哈希函数"和"杂凑函数". 计算出的散列值也称之为"消息摘要"或者"指纹"。
MD 是消息摘要(Message Digest)的缩写。 常用的是 MD5,目前 MD5 已经被证实强抗碰撞性是不安全的,即根据 md5 的算法,现在已经可以产生具有相同y的两个不同x了。所以在安全性高的场合中,不建议使用 md5。
这是一个系列。后面的数字表示y的长度(SHA-1 除外)。 SHA-1 已经被证实强抗碰撞性是不安全的,而 SHA-256/384/512 仍未被攻破,所以后面这三个仍可以使用。后面这三类统称SHA-2。
算法和 SHA-2 已经完全不一样了。 SHA-3 使用的是Keccak算法。Keccak算法理论上可以生成任意长度的散列值,目前在 SHA-3 规范中规定了SHA3-224\256\384\512这四种版本。Keccak使用的是一种称之为海绵结构的分组算法,大意是将x进行分组,然后每个分组计算生成y',再将y'作为输入和下一个明文分组一起计算。
这个算法系列有两个版本: RIPEMD 和 RIPEMD-160。 其中 RIPEMD 已经被证实强抗碰撞性是不安全的。但 RIPEMD-160 仍然是安全的。
散列函数只能确保信息内容不被篡改,而无法保证消息一定是从合法渠道发来的。 例如 Eve 可以伪装成 Alice 向 Bob 发送消息和对应的散列值。 Bob 接受到消息和散列值后,如果校验一致,那么也只能证明消息没有经过篡改,而无法证明消息是 Alice 发来的。
而为了解决这个问题,就需要同时使用散列值和数字签名了。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章