How are Passwords Stored?

密码是如何被存储的?哪些机制预防密码泄漏?

前言

虽然之前制作过一个笔记网站有构建用户注册的部分:my-note🔗,但没有笔记下来发现忘了很多概念,碰巧看到我看过最简单好懂的解说影片:You’re Storing Passwords Wrong. Here’s The Fix - LearnThatStack🔗,把密码保存相关的知识都记录一下。

密码存储

明文存储

将用户提交直接存储到数据库中,当密码流出时就真的没救了,甚至用户往往会多个服务共用相同密码造成更大伤害。

雜湊函式 Hash Function

  1. 只能单向输入输出的函数,可从 password → hash,但极难从 hash → password
  2. 输入固定,输出固定
  3. 输入微小改变,输出差异极大

想像绞肉机,只要攪爛了资料没有任何人有办法在可接受的时间与资源限制下还原,但只要相同的原料被丢进来就会出来相同的结果,也是这样的特性可以被用来验证身份,只需要每次用户提交密码就进行杂凑运算,与记录中杂凑值比对即可,杂凑值无法推断出密码。

彩虹表 Rainbow Table

但常见的密码杂凑组合可能被记录,实际破解时只需要对照记录就能很快破解,这张查找表也被称为彩虹表。

加盐 Salting

为了应对彩虹表降低破解成本以及相同密码有相同杂凑值的问题还会多「加盐」,盐是随机的数据用于在杂凑前添加,使相同的密码也会产生完全不同的结果。

SHA256

SHA256 是安全且快速常见的杂凑算法,但「快」在存储密码的情境下反而会拉低了暴力破解的门槛。

bcrypt

bcrypt 是刻意被设计得「缓慢」的杂凑算法,对用户来说登录时可调整多花费数百毫秒的时间等待,但却能大幅度拉高暴力破解的门槛。