iT邦幫忙

0

驗證信件的安全性(password_hash)

小弟使用password_hash加密驗證碼,並且把驗證碼放入網址的get內,如下
https://xxx.com/yyy.php?id=$id&hash=$password_hash
並將驗證碼儲存在資料庫
使用者從信件點及網址後,會透過id 取得驗證碼,並且跟 $password_hash 做驗證(password_verify),我希望可以使用這個網址的有效時間是三天
問:
1.想請問這樣的驗證方式會不會很容易地被破解出來(因為發現很多驗證碼都是限制60秒到5分鐘)
2.因為password_hash 的長度都是固定的,能否加長提高破解難度?

ps:驗證碼 = 隨機的英文或數字,共8碼

2 個回答

1
黃彥儒
iT邦高手 1 級 ‧ 2021-03-30 15:32:47

1.想請問這樣的驗證方式會不會很容易地被破解出來(因為發現很多驗證碼都是限制60秒到5分鐘)
我認為沒有問題,Email驗證不要只設定5分鐘,我的Mail Server的灰名單就10分鐘了……

2.因為password_hash 的長度都是固定的,能否加長提高破解難度?

我覺得沒什麼意義,SHA512就夠了吧

看更多先前的回應...收起先前的回應...
豬豬人 iT邦新手 5 級 ‧ 2021-03-30 15:37:59 檢舉

回1. 我是希望使用者可以操作三天,三天後才失效,所以才會擔心被破解 謝謝

黃彥儒 iT邦高手 1 級 ‧ 2021-03-30 16:09:23 檢舉

你Link要限制速率阿,只要能確保不能使用大量自動化連線,基本上就不會有被暴力破解的問題

豬豬人 iT邦新手 5 級 ‧ 2021-04-01 13:49:52 檢舉

請問Link要限制速率 要怎麼做呢? 逝去server上設定嗎? 初學者 還請大大給我個方向 謝謝

黃彥儒 iT邦高手 1 級 ‧ 2021-04-01 16:28:00 檢舉

著陸頁加一個我不是機器人就好啦~

1
淺水員
iT邦研究生 2 級 ‧ 2021-03-30 16:31:32

2.因為password_hash 的長度都是固定的,能否加長提高破解難度?

hash 位數再多,驗證碼變化的數量還是固定 62^8(大小寫+數字)
可以考慮用 random_bytes ,這樣 8 位就有 256^8 種變化

【原本方式】
驗證碼:隨機產生的8位英文或數字
資料庫儲存:驗證碼
url參數:password_hash(驗證碼)
比對:比較「url參數」與「password_hash(資料庫儲存)」

【變更為】
亂數字串:使用 random_bytes(8 or more)
資料庫儲存:password_hash(亂數字串)
url參數:password_hash(亂數字串)
比對:直接比較「url參數」與「資料庫儲存」

看更多先前的回應...收起先前的回應...
黃彥儒 iT邦高手 1 級 ‧ 2021-03-30 16:49:24 檢舉

但他放到網址上還是要URL_safe

微笑 iT邦新手 4 級 ‧ 2021-03-30 17:50:38 檢舉

設定兩組要驗證的密文是不是就能等比的提高破譯難度了

淺水員 iT邦研究生 2 級 ‧ 2021-03-30 18:25:39 檢舉

我覺得黃彥儒提到的「限制錯誤嘗試的次數」是很好的做法
例如錯誤嘗試 10 次就註銷這個 token,要求使用者登入後重新產生
(提高難度可以並行,但重要度次之)

另外,關於 url safe 是指 url 的合法性嗎?
因為提問者原本就是把 password_hash 的結果放參數
我想說他應該有用 urlencode 處理了

淺水員 iT邦研究生 2 級 ‧ 2021-03-30 18:28:59 檢舉

這則回答只是想補充
不管 hash 算法產生的結果是幾位
原本亂數產生的驗證碼(或字串)變化度也要要夠大才有意義

我要發表回答

立即登入回答