哈希算法
一,概念
前面涉及到散列表,散列函数,散列算法。那么和哈希算法又是什么关系,其实散列函数对应的算法就是哈希算法。
定义:将任意长度的二进制串映射为固定长度的二进制串,这个映射的规则就是哈希算法。
要设计一个好的哈希算法并不容易,它需要满足如下条件:
1,从哈希值不能反向推导出原始数据。
2,对输入的数据非常敏感,哪怕只是一个bit的变动,最后得到的哈希值也大小不相同。
3,散列冲突的概率要小。
4,哈希算法的执行效率要尽量高效,针对较大的文本,也能快速计算出哈希值。
二,应用场景
1,安全加密。最为常见的哈希加密算法有MD5和SHA.对于安全加密来说,从哈希值不能反推和散列冲突要小两个特性尤为重要。不能反推既是你拿到加密数据也无法破解,散列冲突防止你使用不同的密码也能够得到相同的哈希值。根据鸽巢原理分析目前散列冲突是无法彻底避免。
2,唯一标识。海量的图库中,搜索一张图是否存在,不能单纯地用图片地元信息来对比,因为名称和内容可能各有不同。并且既是用图片的二进制码串进行对比将非常耗时,比较好的办法是每张图片生成唯一标识。根据唯一标识进行判断
3,数据校验。电驴BT下载大电影时是从多个机器并行下载的,这个电影文件被分割成很多文件块,需要等所有文件块都下载完成,再组装成一个完整的电影文件就行了。但是网络传输不是安全的,下载的文件可能不完整,也可能恶意被修改,如何保证各个文件块都是安全,正确,完整的呢?通过哈希算法,对各个文件块分别取哈希值,并且保存在种子文件中。当文件下载完成之后,通过相同的哈希算法,对比下载好的文件块逐一求哈希值和种子中保存的哈希值对比进行验证。
4,散列函数。前面讲过散列表需要使用散列函数,哈希算法需要确保散列函数所得到的哈希值尽量均匀分布,并且散列冲突尽量小。
三,场景实例
1,如果数据库被攻击,用户信息被"脱库“,黑客获取加密后的密文,如何来破解?
MD5哈希算法号称已经被破解了。所以一般使用SHA256加密。黑客获取到密文之后,可以通过猜的方式来破解密码,维护一个常用的字典表,把字典表中的每个密码用哈希算法计算哈希值,然后跟脱库后的密文对比,如果相同,基本上就是字典中的这个密码,毕竟散列冲突的概率极低。
所以一般我们使用哈希算法加密时,会引入一个盐,跟用户的密码组合在一起,增加密码的复杂度。
2,区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?
区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体。区块头保存着 自己区块体 和 上一个区块头 的哈希值。
因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有区块保存的哈希值就不对了。
区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,短时间内几乎不可能做到。