iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1
Security

從以卵擊石到堅若磐石之 Web API 安全性全攻略系列 第 22

Day22-不能說的秘密(四)

前言

前幾天談了那麼多種儲存密碼的方式之後,大家應該都累了,所以今天來談一個比較輕鬆的實際案例

如果我現在要接手一個十年前就寫好的網站(感覺好恐怖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_passwordnew_hash_password 兩個欄位都撈出來,然後看使用者有哪邊的雜湊值就比對那邊就好了,如此一來不管使用者現在用的是哪一種演算法都可以成功登入

都不登入的使用者怎麼辦

到這邊為止基本上就已經差不多了,只要慢慢等舊使用者把 MD5 改成 SHA1 就好了,等全部的使用者都重新登入過後,資料庫內的雜湊值就會全部被換成 SHA1,然後就可以把舊的 hash_password 欄位刪掉了~

雖然理想上是這樣子沒錯,但實際上非常難達到,因為可能有少數使用者註冊完用了幾天之後,就一輩子都不會再回來用。因此即便你的網站大部分都是活躍使用者,過了一年可能還是會有 10% 使用者遲遲沒辦法從 MD5 改成 SHA1 雜湊。但一直維持這種 MD5 跟 SHA1 並行的策略也不是辦法,因此我個人認為最好的方法是設一個期限(譬如說一年),一年過後就直接把所有的 MD5 雜湊值刪掉

而那些在一年內都沒有登入的使用者如果哪根筋不對突然跑回來登入了(感覺機率很低XD),因為資料庫內已經沒有他們的 MD5 雜湊值,所以就直接跳出「因您的帳戶長時間沒有登入,為了保障您的帳號安全,請您重設一個新密碼」讓他們到信箱收信後重設密碼,然後把新密碼的 SHA1 雜湊存起來,而那些沒再登入過的使用者就直接讓他留空就好

小結

今天講解了更新密碼雜湊演算法的流程,雖然更新的過程稍微有點麻煩,而且還必須等使用者自己回來登入才能改過去,但為了使用者的密碼安全還是得做的

關於密碼安全性的部分就講到今天,有任何問題的話歡迎在下方留言,都沒有的話明天就要進入資料庫安全的部分了~


上一篇
Day21-不能說的秘密(三)
下一篇
Day23-你的資料安全嗎(一)
系列文
從以卵擊石到堅若磐石之 Web API 安全性全攻略30

1 則留言

0
jason71708
iT邦新手 4 級 ‧ 2021-10-07 10:09:44

最後段的情況不會有資安疑慮嗎?
我只要知道這些很久沒登入的使用者帳號,加上密碼隨便打,進去後就可以直接重設密碼了。

謝謝你的提問,我這邊沒寫清楚,應該要讓他們去信箱收信然後重設密碼,不然確實會有你提到的問題~

謝謝回答,另外這系列很實用而且淺顯易懂!

謝謝你的支持~寫文章寫到快崩潰就是希望能對大家有幫助XD

我要留言

立即登入留言