Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

哈希函数

哈希函数是密码学中最基础的内容,它和对称加密、非对称加密是密码学中必须掌握的三大算法,相当于密码学的支柱,而且它也是tls/ssls/https的最基础算法。


通过一个例子来解释一下它的含义,比如现在有一堆文本,经由哈希函数就会变成一个固定长度的比特串,或者是以数字指纹来指代。


哈希函数有几个关键词,第一个是单向,比如说一段文本,它可以通过哈希函数单向的去转成数字指纹,但不可能通过这个指纹反推原始的文本信息。第二个是压缩,一般来说我们要运用的场景,也就是原始消息会很长(或文本很大),所以需要压缩,并且还会用来判断这个消息是不是原来的消息。第三个关键词是定长,比如说有一些数字,我用512位的哈希函数处理,那不管是什么样的消息,通过这个哈希函数最后得到的这个结果都是512位,也就是最后生成的数字指纹是定长的。第四个关键词,碰撞/冲突,意思是说比如你有两个不一样的消息,通过哈希函数计算以后,最后得到的哈希值结果是一样的,这就是碰撞和产生冲突,这个基本上是不可避免的。因为把很长的消息压缩,必然会有不同的消息对应到同样一个压缩的哈希值的情况,但是我们要追求的就是强抗碰撞,让这种情况尽可能少的发生。那么引申到第五个关键词,高灵敏,比如我原来的一个一万字的文本,我只改动了其中一个,但我希望最后的结果改变的非常大,这就是高灵敏。只要改一点点,最后的哈希值可能是翻天覆地的变化。以上就是哈希函数的基本介绍。


看到这你会发现这和计算机里的哈希表有很多相同的地方,学计算机的人都知道它的用法,主要是用来储存一个东西,储存之后的查找一般就是需要计算这个键的哈希值,然后再通过哈希值去哈希表里查找,这是计算机里的一个用途。


基于哈希函数安全的属性,它在密码学中的应用非常多,第一个最重要的应用就是完整性检测。举个例子,比如我有一封信件要送到几千里以外的地方,我要判断这个信中途没有被人打开过或篡改过,以前古代的做法是在这个信上面印一个图章,通过这个图章来判断有无改动。而目前的计算机时代则用一些专业的校验办法去校验这个文件是不是原来的状态,比如下载一个文件或者解压一个压缩包,解压缩文件的时候也会有这种校验,像奇偶校验、CRC 校验等,但这两种校验方式没有抗数据篡改的能力,比如信道上传输的丢包、发错包、包的位置不一样等不可抗力的原因造成的问题等等。所以这两种校验只是一种基本校验,如果黑客想改你的数据,是可以通过故意去改你这个校验值实现的。


回到哈希函数上,它看起来本身好像也没有抗数据篡改的能力,但是加上key(密钥)就可以抗击数据篡改。因为你手上有一个钥匙,这个钥匙是只有通信双方才有,所以加了这个密钥以后第三方就没有办法篡改,这就是哈希函数在网络传输当中的第二个应用——数字签名。


第三个应用是登录验证或校对密码,这个我们在生活中经常遇到。它的原理是这样,比如现在有一个用户很多的网站,它会给这上面的注册用户用户名和密码,但是这个密码不能直接储存在数据库,因为如果黑客一旦能够取得这个数据库,就能知道所有用户的密码。所以不能明文储存,一定要加了密以后再存。很多常见的加密办法是加“盐”,相当于咱们做菜的时候加一点佐料。我们在做哈希函数操作的时候,每个用户加的“盐”是不一样的,然后这个“盐”的值会存到数据库,也就是说数据库里会存这个密码的和加上“盐”以后的哈希值,这样就多加了一层保障。


有可能你会想说,为什么这个密码验证它不用什么对称加密、非对称加密这些加密算法,原因是因为这些加密算法都比较慢,哈希算法运算速度是最快的,而且比较简单,所以一般来说像登录验证这种操作经常需要用到哈希算法。


第四个应用就是区块链,我们先来看一下有哪些哈希算法,首先是MD5,它是一种应用非常广泛但也比较老的算法,现在已被证明可以破解,它和下一代SHA-1都已经是不安全的。现在用的比较多的是SHA-2,我们经常看到的SHA-256、SHA-512都是SHA-2的算法。目前新出的是SHA-3,但SHA-2现在还是安全的,所以虽然SHA-3出来了,但是实际上大家项目中用的比较多的还是SHA-2。所谓的SHA-256、SHA-512的意思就是说输出的长度不同,我们上面讲到它输出的这个长度是定长的,所以如果输出长度是512的,那么它就是SHA-512。

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CNChinese