数据结构学习笔记七(哈希算法)

版权声明:转载请注明出处 https://blog.csdn.net/ty13572053785/article/details/85239936

一、什么是哈希算法

       将任意长度的任意二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
哈希算法需要满足的要求:

  • 从哈希值不能反向推导出原始数据(所有哈希算法也叫做单向哈希算法)
  • 对输入数据非常敏感,哪怕只是修改了一个bit,最后得到的哈希值也大不相同
  • 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
  • 哈希算法的执行效率要尽可能高,针对较长的文本,也能快速地计算出哈希值。

二、哈希算法的应用

       哈希算法的应用非常广泛,主要有安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储等。
1.安全加密
       最常用于加密的哈希算法是MD5(MD5消息摘要算法)和SHA(Secure Hash Algorithm),除了这两个之外,还有其他算法,比如DES(Data Encryption Standard),AES(Advanced Encryption Standard)等。
2.唯一标识
       如果要在海量的图库中,搜索一张图是否存在, 不能单纯地用图片名称来比对,因为有可能存在名称相同但图片内容不同的情况。为解决这种问题,可以用哈希算法。我们可以给每一个图片取一个唯一标识,比如,我们可以从图片二进制码串开头取100个字节,从中间取100个字节,从最后再取100个字节,然后将这300个字节放到一块,通过哈希算法(比如MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。
3.数据校验
       例如根据P2P协议下载文件时,文件通常是被分块的,从多台机器上并行下载。网络传输是不安全的,所以下载的文件可能不是完整的。为了校验文件块的安全、正确、完整,可以采用哈希算法。通过哈希算法,对文件块分别取哈希值,并且保存在种子文件中。当文件块下载完成后,对其求哈希值,将求出的哈希值与种子文件的哈希值进行对比,如果不同,则说明文件块不完整。
4.散列函数
       散列函数也是哈希算法的一种应用。散列函数是设计一个散列表的关键,它直接决定了散列冲突的概率和散列表的性能。不过相对于哈希算法的其他应用,散列函数对散列算法冲突的要求低得多。散列函数对于散列算法得到的值是否能反解也并不关心,散列函数中用到的散列算法更加关注散列后的值能否平均分布。
5.负载均衡
6.数据分片
7.分布式存储

三、如何防止数据库中的用户信息被脱库?

       如果用户信息被“脱库”,黑客虽然拿到的是加密之后的密文,但可以根据“猜”的方式来破解密码。维护一个常用密码的字典表(比如000000,123456),把字典中的每个密码用哈希算法计算哈希值,然后拿哈希值跟脱库后的密文比对。如果相同,基本上就可以认为,这个加密之后的密码对应的就是字典中的那个密码。
       针对字典攻击,我们可以引入一个盐(salt),更用户的密码组合在一起,增加密码的复杂度。我们拿组合之后的字符串做哈希算法加密,将它存储到数据库中,进一步增加破解的难度。

猜你喜欢

转载自blog.csdn.net/ty13572053785/article/details/85239936
今日推荐