Sha-256
安全密碼儲存機制
我最近想到了一種安全的密碼儲存機制。
我想問一下以下密碼儲存機制是否可以抵抗具有安全密碼的彩虹表以及知道散列和加鹽機制的攻擊者。
tl;博士:
鹽不是使用隨機生成的鹽,而是從密碼中派生的。因此鹽也不儲存在數據庫中。
- 使用者輸入密碼 (
$password = "MySecurePassword123"
)
$password
正在使用 sha256 ($hashed_pw = ccf9ac1c9ce02b9bb7810a1fff51e474f37d98c3582f2d3b5036caf559afd9bc
)進行雜湊處理
$password
使用 sha256對前 5 個(假設密碼長度為 8 個)字元進行雜湊處理。讓我們將生成的雜湊稱為“鹽”。($salt = 52824aa0d517c8d6e24d59e1374ee202e97ba730b00ae577c94cdf157cbc29af
)
$salt``hashed_pw
使用 sha256 ($result = sha256($salt + $hashed_pw) = 63617328f94d025f2489f170388b42d954a73391250b0ad29bbfb7ce2f8373e1
)附加並再次散列最後
$result
被儲存在數據庫中。用於生成 sha256 雜湊的工具:https ://emn178.github.io/online-tools/sha256.html
這是一種非常不安全的密碼儲存方式。
這裡有兩個重要因素在起作用:
- 相同的密碼將始終導致相同的輸出,從而允許使用簡單的查找表
- 您的整個算法在計算上很便宜,允許快速計算查找表或只是蠻力
這意味著攻擊者可以
output -> password
相當快速地計算查找表,並根據查找表檢查數據庫中的原始值。一個粗略的估計:我可以下載 1000 萬個密碼列表並通過您的算法執行每個密碼。
openssl speed sha256
報告說我的筆記型電腦每秒可以在 64 字節塊上執行約 3M 次操作(上一步中的大小)。將其除以三(您正在執行的 sha256 操作的數量,儘管有些操作在較小的塊上因此更快),我可以在平均硬體上在幾秒鐘內建構一個 10M 的查找表。如果您將此方法用於擁有數千名使用者的站點,您會發現大量使用者使用在數據庫中找到的密碼。
這種近似方法可以在幾分鐘內實施和執行,並將確定相當一部分使用者的密碼(取決於他們的表現如何,但即使一個也太多了)。注意沒有提到彩虹表。這些不是必需的,因為給定的密碼總是會產生相同的儲存值。