21、哈希算法(上)
思考:如何防止数据库中的用户信息被脱库?
还记得 2011 年 CSDN 的“脱库”事件吗?当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,很多网友对 CSDN 明文保存用户密码行为产生了不满。如果你是 CSDN 的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?
主要内容
主要内容:讲述在实际的开发中,该如何用哈希算法解决问题。
哈希算法
定义:将任意长度的二进制串映射为固定长度的二进制串的算法,称为哈希算法
哈希算法的要求:
- 高效
- 不能通过哈希值退出原始值
- 哈希冲突小,不同原始值产生相同哈希值的概率要小
- 输入敏感,即使改了一个字符,生成的哈希值也要大不同
1 |
|
应用场景
安全加密
最常用在加密。因为无法通过哈希值反推原始值,所以能做到加密效果。
唯一标识
因为生成的哈希值,很难有重复的(冲突小),所以可以作为唯一值使用
数据校验
对于大文件的分批下载,为了确保下载的东西是我们想要的并且未更改的,可以用哈希函数给每批文件求得哈希值,然后下载完毕后再对每批文件求哈希值,然后对比一下,一致则是安全的。
利用的是哈希 [输入敏感,即使改了一个字符,生成的哈希值也要大不同] 的特性
解答思考
思考:如何防止数据库中的用户信息被脱库?
解答:
- 先选择更安全的哈希算法,比如 SHA 等
- 再引入“盐(salt)”,跟用户密码组合,增加密码负责度
- 最后用哈希函数加密组合后的密码
内容总结
讲了哈希的使用场景,安全加密、唯一标识、数据校验,其实就利用的哈希算法的特性
新的思考
最近很火的区块链,底层运用了哈希算法,那你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?
区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体。
区块头保存着 自己区块体 和 上一个区块头 的哈希值。
因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有区块保存的哈希值就不对了。 区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,短时间内几乎不可能做到。
21、哈希算法(上)
https://mrhzq.github.io/职业上一二事/算法学习/极客-数据结构与算法之美/基本算法/21、哈希算法(上)/