mysql - 当加盐算法需要改变,数据库该如何更新?
巴扎黑
巴扎黑 2017-04-17 11:46:35
[MySQL讨论组]

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

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

  • 用户每次登录都要判断是否已经更新其密码加盐值,在某种意义上来说会不会是不环保的?
  • 几百年不登录一次的用户需要怎么处理?

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

巴扎黑
巴扎黑

全部回复(5)
PHP中文网

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

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

PHPz

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

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

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

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

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

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

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

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

ringa_lee

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

天蓬老师

只能做兼容了吧

迷茫

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号