1.定义
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法;而通过原始数据映射之后得到的二进制值串就是哈希值
2. 哈希算法的要求
- 从哈希值不能反向推导出原始数据
- 对输入数据非常敏感
- 散列冲突概率小,即不同的原始数据,哈希值相同的概率较小
- 执行效率高效
3. 应用
- 安全加密
最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)
- 唯一标识
若在海量的图片库中搜索一张图是否存在,可以给每个图片设置一唯一标识,或者信息摘要;我们知道任何文件在计算中都可以表示成二进制码串,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中。
如果还想继续提高效率,我们可以把每个图片的唯一标识,和相应的图片文件在图库中的路径信息,都存储在散列表中。当要查看某个图片是不是在图库中的时候,我们先通过哈希算法对这个图片取唯一标识,然后在散列表中查找是否存在这个唯一标识。
- 数据校验
BT下载:我们通过哈希算法,对 100 个文件块分别取哈希值,并且保存在种子文件中,由于哈希算法对数据非常敏感,当文件块下载完成之后,我们可以通过相同的哈希算法,对下载好的文件块逐一求哈希值,然后跟种子文件中保存的哈希值比对。如果不同,说明这个文件块不完整或者被篡改了,需要再重新从其他宿主机器上下载这个文件块
- 散列函数
实际上,散列函数也是哈希算法的一种应用。散列函数是设计一个散列表的关键。它直接决定了散列冲突的概率和散列表的性能
插入:加密中的加salt
盐(Salt),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”
通常情况下,当字段经过散列处理(如MD5),会生成一段散列值,而散列后的值一般是无法通过特定算法得到原始字段的。但是某些情况,比如一个大型的彩虹表,通过在表中搜索该MD5值,很有可能在极短的时间内找到该散列值对应的真实字段内容。
加盐后的散列值,可以极大的降低由于用户数据被盗而带来的密码泄漏风险,即使通过彩虹表寻找到了散列后的数值所对应的原始内容,但是由于经过了加盐,插入的字符串扰乱了真正的密码,使得获得真实密码的概率大大降低
实现原理
加盐的实现过程通常是在需要散列的字段的特定位置增加特定的字符,打乱原始的字串,使其生成的散列结果产生变化。比如,用户使用了一个密码:123456,经过MD5散列后,可以得出结果:xxx ,黑客拿到脱机的数据后,通过彩虹表匹配可以轻松破解常用密码。如果加盐,密码123456加盐后可能是12ng34qq56zz,再对加盐后的密码进行hash后值就与原密码hash后的值完全不同了