我想以网站管理员能够升级密码哈希算法的方式设计一个用户表。
为不同的用户使用多个版本的哈希并创建一个名为的字段是否正确hashingVersion (TINYINT)
?
这是一个好习惯吗?还是有更好的方法?
我想以网站管理员能够升级密码哈希算法的方式设计一个用户表。
为不同的用户使用多个版本的哈希并创建一个名为的字段是否正确hashingVersion (TINYINT)
?
这是一个好习惯吗?还是有更好的方法?
首先,你提到你使用盐很好。
我建议在数据库中创建另一个字段来存储新版本的密码。
+-------+--------+--------+
| user | bcrypt | scrypt |
+-------+--------+--------+
| tom | null | *** |
| peter | null | *** |
| mary | *** | null |
+-------+--------+--------+
当前身份验证将首先尝试使用新哈希进行验证,如果新哈希为null
,则使用旧哈希进行身份验证。
更改密码将强制删除旧哈希。新用户将默认使用新算法。
这样一个字段不会有混合信息,更容易管理。您可能希望强制用户在下次登录时更改密码,以便他们更快地获得带有盐的新哈希。
由于新的身份验证必须与两种哈希一起使用,因此必须在使用之前对其进行验证,以最大程度地减少安全问题。否则一个粗心的or
错误会导致错误的登录。