首页 > 当加盐算法需要改变,数据库该如何更新?

当加盐算法需要改变,数据库该如何更新?

假设网站上有大量的注册用户,因为某些情况需要改变用户密码的加盐算法,那么数据库里的用户信息该怎么更新?

我想到的方法是:新增一个字段,新的加盐算法正式上线后,用户第一次成功登录时就把新的加盐后的值存到新字段,旧的值去掉。
但是这样的话:

P.S.加盐算法是不是一般都要有长远的考虑,不要经常改变?


php 的密碼加密函數的解決方案是把加密方法作爲加密結果的前綴,只要讀取這個前綴即可知道用何種算法。

如以前沒有前綴,那麼找一個不會出現在以前版本結果里的字符串做前綴即可。

至於更新,當然要把密集的運算稀釋掉,比如用用戶登錄做觸發。至於是否登錄成功,這其實意義不大。

好比 PHP 的寫時複製,按需計算而不是按意義計算。這樣不登錄的用戶也不用考慮了。

另外,持續判斷是何種加密算法並不是冗餘的,它應該算作加密算法的一部分。不停重複運行加密算法算不算冗餘呢?

長遠的考慮不意味着阻止突發事件的處理。比如一向用 md5 加密,卻突然發現 md5 爆出重大漏洞(雖然可能性很低),這時候要不要立即更換?

所謂的長遠,不僅要考慮到正常時期,還要考慮到突發事件。

這也是爲什麼你遇到這個問題——一開始就沒設計好,沒做好長遠的考慮。


只能做兼容了吧


简单的办法就是新算法在密码前面加个标志头,比如以 %new% 开头的就是新算法之类的。如果没有标志头的话也还简单先老算法算,如果匹配到了就登陆,并用新算法更新密码。如果没匹配到则用新算法算,匹配到了则登陆,未匹配到则失败。当然前提是碰撞到的概率足够的小..这个我想一般的情况下都是满足的。


这事我干过,我的做法就是不做任何旧的兼容。让用户重新改密码。不过前提是你愿意像我一样承担这样带来的抱怨。


加盐算法可以很简单的判断

新增一个版本字段,用户登录时,判断版本,如果是老版算法,则使用老版验证,验证成功后再静默地更新到新版算法。如果是新版算法那么就直接用新版算法登录

【热门文章】
【热门文章】