哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要函数是一个单向函数。
哈希算法就是空间映射函数。
求模算法作为一种不可逆的计算方法,已经成为了整个现代密码学的根基。只要是涉及到计算机安全和加密的领域,都会有模计算的身影。散列算法也并不例外,一种最原始的散列算法就是单纯地选择一个数进行模运算。
但是简单的求模运算容易找到规律,所以我们可以在散列函数中加入一个异或过程。
很明显的,加入一层异或过程之后,计算之后的结果规律性就不是那么明显了。
如果用户使用连续变化的一系列文本与计算结果相比对,就很有可能找到算法所包含的规律。但是我们还有其他的办法。比如在进行计算之前对原始文本进行修改,或是加入额外的运算过程(如移位)。
具有最重要的两条性质:
不可逆与无冲突
不可逆:当你知道x的HASH值,无法求出x;
无冲突:当你知道x,无法求出一个y, 使x与y的HASH值相同。
具体特性描述如下:
(1)原始密码经哈希函数计算后得到一个哈希值
(2)改变原始密码,哈希函数计算出的哈希值也会相应改变
(3) 同样的密码,哈希值也是相同的
(4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少
为了保证哈希函数在密码学上的安全性,必须满足以下3个条件。
1)抗冲突(collision-resistance)。简单来说,哈希函数抗冲突指的是不同的输入不能产生相同的输出。
抗冲突并不是说不会有冲突,只不过找到有冲突的两个输入的代价很大,不可承受。这就好像暴力破解一个有效期为20年的密码,整个破解过程长达30年,虽然最后密码被破解了,但是由于密码有效期过了,所以也就失去了意义。
2)信息隐藏(information hiding)。这个特性是指如果知道了哈希函数的输出,不可能逆向推导出输入。
3)可隐匿性(puzzle friendly)。如果有人希望哈希函数的输出是一个特定的值(意味着有人事先知道了哈希函数的输出结果),只要输入的部分足够随机,在足够合理的时间内都将不可能破解。这个特性主要是为了对付伪造和仿制。
比较常用的有:MD5和SHA。
在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。
1)最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。
2)字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。现在我们来看一下查表法的原理。
查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。
为密码加盐(Salt)
从上面的查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。
盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。
密码学中常用的哈希算法有MD5、SHA1、SHA2、SHA256、SHA512、SHA3、RIPEMD160,下面简单介绍一下。
·MD5(Message Digest Algorithm5)。MD5是输入不定长度信息,输出固定长度128bits的算法。经过程序流程,生成4个32位数据,最后联合起来成为一个128bits哈希。基本方式为求余、取余、调整长度、与链接变量进行循环运算,得出结果。MD5算法曾被广泛使用,然而目前该算法已被证明是一种不安全的算法。王晓云教授已经于2004年破解了MD5算法。
·SHA1。SHA1在许多安全协议中广为使用,包括TLS和SSL。2017年2月,Google宣布已攻破了SHA1,并准备在其Chrome浏览器产品中逐渐降低SHA1证书的安全指数,逐步停止对使用SHA1哈希算法证书的支持。
·SHA2。这是SHA算法家族的第二代,支持了更长的摘要信息输出,主要有SHA224、SHA256、SHA384和SHA512,数字后缀表示它们生成的哈希摘要结果长度。
·SHA3。看名称就知道,这是SHA算法家族的第三代,之前名为Keccak算法,SHA3并不是要取代SHA2,因为目前SHA2并没有出现明显的弱点。
·RIPEMD-160(RACE Integrity Primitives Evaluation Message Digest160)RIPEMD160是一个160位加密哈希函数。它旨在替代128位哈希函数MD4、MD5和RIPEMD-128。
这几种流行的算法,它们最重要的一点区别就是“强抗碰撞性”。
参考学习:Hash算法总结