1. 密码是如何在数据库存储的
要说密码怎么存储,还得先说hash算法
1.1 Hash算法
- 散列 输入的肯定对应唯一的输出映射表
- HASH算法不是大学里数据结构课里那个HASH表的算法。这里的HASH算法是密码学的基础,比较常用的有MD5和SHA,最重要的两条性质
- 不可逆和无冲突。
- 所谓不可逆,就是当你知道x的HASH值,无法求出x;
- 所谓无冲突,就是当你知道x,无法求出一个y, 使x与y的HASH值相同。
- 这两条性质在数学上都是不成立的。因为一个函数必然可逆,且由于HASH函数的值域有限,理论上会有无穷多个不同的原始值,它们的hash值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资源都做不到。
若想了解hash算法—可以点击此链接深入了解
1.2 密码是如何存储的
- 首先获取到你的密码
- 服务器对密码进行hash运算。然后将值存入数据库。
- 下次登陆的时候,输入密码。服务器将密码进行hash运算,然后搜索数据库是否有此hash值与之对应。如若对应。则登入。否则则拒绝
- 这样做有什么好处呢?
可以避免密码明文存储,即使把数据库给黑客,黑客不知道公司所采取的hash算法细节。也无法获取用户真实密码。
1.4 还有什么更好的办法吗?
- 加盐提高安全性
将明文密码混入 “随机因素 “,然后进行单向哈希后存储,也就是所谓的”Salted Hash”。这个方式相比上面的方案,最大的好处是针对每一个数据库中的密码,都需要建立一个完整的 rainbow table 进行匹配。 因为两个同样使用 “passwordhunter”作为密码的账户,在数据库中存储的摘要完全不同。10 多年以前,因为计算和内存大小的限制,这个方案还是足够安全的,因为攻击者没有足够的资源建立这么多的 rainbow table。 但是,在今日,因为显卡的恐怖的并行计算能力,这种攻击已经完全可行。此处引用自知乎
1.5 缓存是如何实现的
- 客户端向服务端发送请求img照片
- 客户端收到请求后转发给文件系统
- 文件系统将文件和Etag信息返回给服务器
- 服务器转发给用户
- 用户本地保存img和Etag文件信息
用户第二次访问同一资源的时候
6. 客户端发送Etag信息给服务器,询问服务器是否修改过这个文件
7. 文件校验本地Etag信息和客户端保存的Etag信息
8. 如果没改变则返回304
9. 改变即通知客户端并返回新的值
业余画师还望见谅
- 散列海量数据。分而治之。
假设有一万个文件,三台服务器提供给用户下载,计算出hash值然后与3取模。存入服务器!