2013-05-30 52 views
2

我想设计一个用户表的方式,网站管理员能够升级密码哈希算法。多个版本的哈希密码

为不同的用户使用多个散列版本并创建一个名为hashingVersion (TINYINT)的字段是否正确?

这是一个很好的做法吗?或者有没有更好的方法?

+0

你是什么意思“哈希版本”?你应该更好地使用盐。 – str

+0

我用盐。版本示例:1为bcrypt,2为scrypt。现在我使用bcrypt,将来我会使用scrypt,但有些用户可能无法登录来升级他们的密码。 – amerza

回答

2

首先,你提到你使用盐是很好的。

我会建议创建另一个字段里面的数据库存储新版本的密码。

+-------+--------+--------+ 
| user | bcrypt | scrypt | 
+-------+--------+--------+ 
| tom | null | *** | 
| peter | null | *** | 
| mary | *** | null | 
+-------+--------+--------+ 

当前的认证将首先尝试与新的哈希来验证,如果新的散列null,与旧散列进行身份验证。

更改密码将强制删除旧散列。 新用户将默认使用新算法。

这样一个字段不会有混合的信息,而且更容易管理。 您可能希望强制用户在下次登录时更改密码,以便他们可以更快地获得带有盐的新哈希值。

因为新的身份验证必须与两个哈希协同工作,所以在使用之前必须验证它以最大限度地降低安全性问题。否则,粗心的or错误会导致登录失败。

+0

问题是散列算法可能不会限制为两个,我们不想制作3个或更多表,也不希望每次引入新算法时都要修改数据库。使用版本字段有单独字段的优点吗? – amerza

+1

@amerza我只看到使用你所建议的选项的缺点 - 密码字段必须是所用算法的最大尺寸。例如,如果你有3个长度分别为30,40和100的场地,那么你的场地的长度必须为100米。如果这不是问题,那就去吧 –

+0

@Vlad Preda,非常感谢 – amerza