21、哈希算法(上)

思考:如何防止数据库中的用户信息被脱库?
还记得 2011 年 CSDN 的“脱库”事件吗?当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,很多网友对 CSDN 明文保存用户密码行为产生了不满。如果你是 CSDN 的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?

主要内容

主要内容:讲述在实际的开发中,该如何用哈希算法解决问题。

哈希算法

定义:将任意长度的二进制串映射为固定长度的二进制串的算法,称为哈希算法
哈希算法的要求:

  • 高效
  • 不能通过哈希值退出原始值
  • 哈希冲突小,不同原始值产生相同哈希值的概率要小
  • 输入敏感,即使改了一个字符,生成的哈希值也要大不同
1
2
3
MD5("今天我来讲哈希算法") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b
MD5("我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb

应用场景

安全加密

最常用在加密。因为无法通过哈希值反推原始值,所以能做到加密效果。

唯一标识

因为生成的哈希值,很难有重复的(冲突小),所以可以作为唯一值使用

数据校验

对于大文件的分批下载,为了确保下载的东西是我们想要的并且未更改的,可以用哈希函数给每批文件求得哈希值,然后下载完毕后再对每批文件求哈希值,然后对比一下,一致则是安全的。
利用的是哈希 [输入敏感,即使改了一个字符,生成的哈希值也要大不同] 的特性

解答思考

思考:如何防止数据库中的用户信息被脱库?
解答:

  1. 先选择更安全的哈希算法,比如 SHA 等
  2. 再引入“盐(salt)”,跟用户密码组合,增加密码负责度
  3. 最后用哈希函数加密组合后的密码

内容总结

讲了哈希的使用场景,安全加密、唯一标识、数据校验,其实就利用的哈希算法的特性

新的思考

最近很火的区块链,底层运用了哈希算法,那你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?

区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体。
区块头保存着 自己区块体 和 上一个区块头 的哈希值。
因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有区块保存的哈希值就不对了。 区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,短时间内几乎不可能做到。


21、哈希算法(上)
https://mrhzq.github.io/职业上一二事/算法学习/极客-数据结构与算法之美/基本算法/21、哈希算法(上)/
作者
黄智强
发布于
2024年1月13日
许可协议