前几天谈了那麽多种储存密码的方式之後,大家应该都累了,所以今天来谈一个比较轻松的实际案例
如果我现在要接手一个十年前就写好的网站(感觉好恐怖XD),这个网站原本是用 MD5 来对使用者的密码进行杂凑,但因为 MD5 实在太不安全了,所以希望可以换成使用 SHA1 来做杂凑,那到底该怎麽换呢?
新的使用者是最好处理的,首先,你的资料库中应该原本就有一个 hash_password
栏位用来存 MD5 杂凑的结果,为了把演算法换过去 SHA1,你必须建立一个新的 new_hash_password
栏位,避免两种不同演算法的 hash 混杂在同一个栏位,到时候麻烦的是自己
有了 new_hash_password
栏位之後,如果有新的使用者想要注册,就直接把 SHA1 杂凑的结果存到 new_hash_password
,而原本的 hash_password
就直接留空。所以在这一步做完之後,你的资料库中应该会有少数的新使用者是用 SHA1,而大部分的旧使用者还是使用 MD5 杂凑
而旧的使用者方面,因为我们无法直接从 MD5 杂凑值得到使用者的原始密码,因此当然不可能直接算出 SHA1 杂凑值
唯一的方法把 MD5 改成 SHA1 的方法就是在使用者登入时,确认密码正确之後,就先把 SHA1 杂凑值存到 new_hash_password
栏位,接着再把旧的 hash_password
栏位删掉(一定要删掉,因为 MD5 太不安全了,存着只会降低安全性),如此一来就可以逐渐把使用者的杂凑值从 MD5 改成 SHA1 了~
登入功能的话也不用改太多,原本的登入是在收到请求後去检查 MD5 杂凑值跟 hash_password
栏位是否相同,是的话就放行
但因为现在有些使用者使用 MD5 而有些则是 SHA1,所以在验证的方式就会变成先把 hash_password
跟 new_hash_password
两个栏位都捞出来,然後看使用者有哪边的杂凑值就比对那边就好了,如此一来不管使用者现在用的是哪一种演算法都可以成功登入
到这边为止基本上就已经差不多了,只要慢慢等旧使用者把 MD5 改成 SHA1 就好了,等全部的使用者都重新登入过後,资料库内的杂凑值就会全部被换成 SHA1,然後就可以把旧的 hash_password
栏位删掉了~
虽然理想上是这样子没错,但实际上非常难达到,因为可能有少数使用者注册完用了几天之後,就一辈子都不会再回来用。因此即便你的网站大部分都是活跃使用者,过了一年可能还是会有 10% 使用者迟迟没办法从 MD5 改成 SHA1 杂凑。但一直维持这种 MD5 跟 SHA1 并行的策略也不是办法,因此我个人认为最好的方法是设一个期限(譬如说一年),一年过後就直接把所有的 MD5 杂凑值删掉
而那些在一年内都没有登入的使用者如果哪根筋不对突然跑回来登入了(感觉机率很低XD),因为资料库内已经没有他们的 MD5 杂凑值,所以就直接跳出「因您的帐户长时间没有登入,为了保障您的帐号安全,请您重设一个新密码」让他们到信箱收信後重设密码,然後把新密码的 SHA1 杂凑存起来,而那些没再登入过的使用者就直接让他留空就好
今天讲解了更新密码杂凑演算法的流程,虽然更新的过程稍微有点麻烦,而且还必须等使用者自己回来登入才能改过去,但为了使用者的密码安全还是得做的
关於密码安全性的部分就讲到今天,有任何问题的话欢迎在下方留言,都没有的话明天就要进入资料库安全的部分了~
<<: 自动化测试,让你上班拥有一杯咖啡的时间 | Day 23 - 避免使用 cy.wait
D3js 浪漫复刻ExpertOption的养眼图表 用途 在以往实现d3图表时,多半是功能优先,可...
利用 provide & inject 机制,父元件当作所有其子元件的 provider,无...
K8s - Kubernetes Django 部署笔记 参考资料 Windows 7 安装Dock...
大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...
复制字串 i.strcpy() 宣告时宣告另一空字元字串,当strcpy()执行完毕时,就会将此字...