密码是如何在服务器上存储和校验的?哈希算法有什么用?缓存是如何实现的?

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 密码是如何存储的

  1. 首先获取到你的密码
  2. 服务器对密码进行hash运算。然后将值存入数据库。
  3. 下次登陆的时候,输入密码。服务器将密码进行hash运算,然后搜索数据库是否有此hash值与之对应。如若对应。则登入。否则则拒绝
  • 这样做有什么好处呢?
    可以避免密码明文存储,即使把数据库给黑客,黑客不知道公司所采取的hash算法细节。也无法获取用户真实密码。
    在这里插入图片描述

1.4 还有什么更好的办法吗?

  • 加盐提高安全性

将明文密码混入 “随机因素 “,然后进行单向哈希后存储,也就是所谓的”Salted Hash”。这个方式相比上面的方案,最大的好处是针对每一个数据库中的密码,都需要建立一个完整的 rainbow table 进行匹配。 因为两个同样使用 “passwordhunter”作为密码的账户,在数据库中存储的摘要完全不同。10 多年以前,因为计算和内存大小的限制,这个方案还是足够安全的,因为攻击者没有足够的资源建立这么多的 rainbow table。 但是,在今日,因为显卡的恐怖的并行计算能力,这种攻击已经完全可行。此处引用自知乎

1.5 缓存是如何实现的

  1. 客户端向服务端发送请求img照片
  2. 客户端收到请求后转发给文件系统
  3. 文件系统将文件和Etag信息返回给服务器
  4. 服务器转发给用户
  5. 用户本地保存img和Etag文件信息

用户第二次访问同一资源的时候
6. 客户端发送Etag信息给服务器,询问服务器是否修改过这个文件
7. 文件校验本地Etag信息和客户端保存的Etag信息
8. 如果没改变则返回304
9. 改变即通知客户端并返回新的值

在这里插入图片描述
在这里插入图片描述


业余画师还望见谅


  • 散列海量数据。分而治之。
    假设有一万个文件,三台服务器提供给用户下载,计算出hash值然后与3取模。存入服务器!
原创文章 116 获赞 207 访问量 66万+

猜你喜欢

转载自blog.csdn.net/sexyluna/article/details/102397196
今日推荐