就个人而言,我可能会同时实现新用户获得强大的现代散列(bcrypt 或其他密钥增强加密散列)和老用户使用弱散列包裹 bcrypt。在人们抱怨额外的实现复杂性之前,另一种选择是总是强制新用户使用弱散列算法包裹强散列算法,这意味着你永远不会摆脱原来的方案。
我会有一些类似于 , , 或 in crypt 的类型哈希方案的记录指示符$1$
($2a$
引$5$
自$6$
crypt 手册页):
If salt is a character string starting with the characters "$id$" fol‐
lowed by a string terminated by "$":
$id$salt$encrypted
... id identifies the encryption
method used and this then determines how the rest of the password
string is interpreted. The following values of id are supported:
ID | Method
─────────────────────────────────────────────────────────
1 | MD5
2a | Blowfish (not in mainline glibc; added in some
| Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
在这种情况下,您需要三种类型的密码哈希:
- 旧的快速弱散列
- 用强盐包裹在慢速散列周围的旧的快速弱散列
- 新的慢哈希。
在第 1 天,我会将第 1 类中的所有内容移至第 2 类。新密码将放入第 3 类。此外,当人们登录时,您甚至可以将每个成功验证的哈希从第 2 类迁移到第 3 类,而明文密码在内存中。在某些时候,您甚至可以完全消除弱散列方案的任何证据/遗留维护。(例如,强制帐户在更改后 2 年以上未登录的用户重置其密码)。