vlambda博客
学习文章列表

安全技术系列(二) 密码学-哈希算法


第二部分 单向散列(哈希算法)

哈希是理解数字签名和加密通信等技术的基础,它不是一种算法,它指代的一类型算法。哈希,英文是 hash ,本来意思是”切碎并搅拌“,有一类型的菜的做法就类似于这样的:




哈希函数的运算结果就是哈希值,它也翻译叫做散列函数-散列值,它的特征在于:



随机数量输入数据,将其加密,得出一个固定长度输出数据

哈希算法是一种只能加密,不能解密的密码学算法,输入可以是任何数据,只要能代表单个字节,一个MP3文件,整本小说,你的银行账单,甚至是整个互联网。但是从输出的哈希值倒推数据是不可能的





哈希算法的特点

        +++ 从哈希值不能反向推导原始数据,也叫单向散列。

        +++ 对输入数据敏感,哪怕只改了一个Bit,最后得到的哈希值也大不相同。


对哈希算法的要求

        >>> 散列冲突的概率要小。

        >>> 哈希算法执行效率要高,散列结果要尽量均衡。


* 散列函数:是构造散列表的关键。它直接决定了散列冲突的概率和散列表的性质。不过相对哈希算法的其他方面应用,散列函数对散列冲突要求较低,出现冲突时可以通过开放寻址法或链表法解决冲突。对散列值是否能够反向解密要求也不高。反而更加关注的是散列的均匀性,即是否散列值均匀落入槽中以及散列函数执行的快慢也会影响散列表性能。所以散列函数一般比较简单,追求均匀和高效。

* 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。





哈希算法的核心应用


基于以上哈希算法的优秀品质,不难看出哈希算法的最大应用是在:防篡改。因为如果信息在传递过程中被篡改,那么运行哈希计算得到的哈希值与原来的哈希值不一样。它可以用于检验信息是否相同(文件校验),或者检验信息的拥有者是否真实(数字签名)。更多见《哈希算法的应用举例》

        


常见的哈希算法



可以在上面试试各种哈希的运算结果


http://www.fileformat.info/tool/hash.htm


ResultsOriginal text mercyOriginal bytes 6d:65:72:63:79 (length=5)Adler32 064f0221CRC32 9b040e12Haval 022fd4ffb30059d7bf8adfd3ba537cadMD2 52e3a78ca4efc1968084066717af484dMD4 bacbf5ef97a19af61e0657f34cbd2dddMD5 bf2ff2ed3c83c3c5ce510c4666f6fb0dRipeMD128 5bf372ea800a03808b09433c10bfc675RipeMD160 c19a482242c3dc33f142acbd2a0b2f378f10772eSHA-1 98f785e3ca1d59ba2dc821ad5b66fba1a95cf6a9SHA-256 4d51fd998fd3a724c06ab00bb151c13a45de268c22cb4f088d826dc260f06218SHA-384 a0d081e70643ca957040cf37067c665429107dc78e7ec960c83026cfb07a87013ae99c7ec9ff1489fffd4e86311721c9SHA-512 cf25a526a4e80048f12caf11b1d310e451de0b89ae7d385550b58b5d0a71bae83c59a87a6b6cedefff79c6483b5d71dfc07f900a17ab789cd2aa3b38f17247a4Tiger bacc12b7aa01b3d27d0967067c21a8337f983fcf6dbc94bfWhirlpool 5cbf80bf3abcd3d05e18cb3f98ce72c75eda3fbf579f8eddc21a8ea53218b52170221d4e53e5740332086bf6202b446d7cafe86dfcb190bc96f22b8c49da28dc


  • MD5的优点是快,但MD5作为文件校验方法已经不可靠了,可以人为制造碰撞。如果文件的数字签名,摘要算法为MD5,应保持警惕。

  • 对于封闭的内部环境,加盐Hash依然是可用的,但这种“加强”是脆弱的。

  • 几种Hash方法的参考性能为:
    MD5:335MiB/s
    SHA-1:192MiB/s
    SHA-256:139MiB/s
    SHA-512:154MiB/s

  • 至于SHA-1,目前还没有已知的、公开的碰撞案例,但在理论上已存在风险。

  • 生产工具,比如PowerShell,默认的文件Hash方法目前是SHA-256。

  • Linux发行版,比如openSUSE、Fedora,其ISO文件的CHECKSUM目前是带签名SHA-256。


自从王小云破解MD5算法后,人为制造碰撞来破解就不再是新花样,如果不同的输入得到了相同的哈希值,就发生了“哈希碰撞“(collision),具体的见《MD5碰撞》