介绍
hash算法,又称哈希或散列算法,它能将任意长度的二进制值映射为较短的固定长度的二进制值,即hash值。并且不同的明文很难映射为相同的hash值。hash值在应用中又称为数字指纹(fingerprint)、数字摘要(digest)或者消息摘要
一个优秀的hash算法,具有如下特点:
- 正向快速:给定明文和hash算法,在有限时间和有限资源内能计算出hash值
- 逆向困难:给定(若干)hash值,在有限时间内很难(基本不可能)逆推明文
- 输入敏感:原始输入信息修改一点信息,产生的hash值看起来应该都有很大不同
- 抗冲突(抗碰撞性)
对不同的关键字可能得到同一hash值,或者说两段内容不同的明文,它们的hash值可能一致,这种现象称冲突或者碰撞
抗冲突又称为“抗碰撞性”或冲突避免。哈希函数抗冲突就是不同的输入不能产生相同的输出
抗冲突并不是不会有冲突,只不过找到有冲突的两个输入的代价非常大
目前流行的hash算法
- MD4(message digest):输出为128位二进制 - 16字节
- MD5:输出为128位二进制
- SHA-1(secure hash algorithm - 1):加密哈希算法;输出为160位二进制值
- SHA-2(secure hash - 2):SHA-224、SHA-256(256的二进制、64位的16进制,比特币常用)、SHA-384、SHA-512
- SHA-3,之前名为keccak算法,是一个加密杂凑算法
- Keccak的输出长度分别有:512、384、256、224
- SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点
- 由于对MD5出现成功的破解,以及对SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密杂凑算法,也就是现在的SHA-3
- RIPEMD-160(RACE完整的原始评估信息摘要):是一个160位的加密哈希函数,旨在替换128位哈希函数MD4、MD5
破解的方法
- 寻找碰撞法(无应用价值)
- 穷举法:耗时,需大量计算
- 密码字典暴力破解:耗费存储空间
- 彩虹表攻击
- 彩虹表其实是穷举法和密码字典方法的折衷,将耗时和占用空间控制在可接受的范围内
防御方法
防御方法:加盐。即在密码的特定位置插入特定的字符串,这个特定字符串就是“盐”,加盐后的密码经过哈希加密得到的哈希串与加盐前的哈希串完全不同,黑客用彩虹表得到的密码根本就不是真正的密码。即时黑客知道了“盐”的内容、加盐的位置,还需要重新生成彩虹表,因此加盐能大大增加利用彩虹表攻击的难度
注意
- 一般认为MD5和SHA1已经不够安全,不具备“强抗碰撞性”,推荐至少使用SHA-256算法
- 主流的web开发依然使用md5来保存用户的密码(常用)
为了保护账号安全,所有网站都不会保存用户的密码明文,而是用哈希加密算法对密码进行计算,将得到的哈希串保存在数据库中,每次用户登陆时会将用户提交的密码用同样的算法计算,并将结果与数据库中保存的哈希串比对以验证用户身份