Sha-1

密碼的 MD5 雜湊的 SHA1 雜湊是否安全?

  • October 16, 2016

密碼學不是我的領域,如果這個問題很煩人,請原諒我。

前段時間,我實現了一個 Internet 站點,其中的數據庫有一個 users 表。為了將密碼保存在其使用者表欄位中,我使用了

encrypted_password= sha1(md5(raw_password));

我使用的方法的優缺點是什麼?

**優點:**唯一的優點是您的方法比以明文形式儲存密碼要好得多。

**缺點:**如果攻擊者獲得了對您數據庫的訪問權限,他只需少量工作即可輕鬆恢復 99% 的密碼,而且他甚至不需要筆記型電腦以外的任何東西。

這裡的教訓是平常的。永遠不要建立自己的加密貨幣。使用像Argon2這樣的安全密碼雜湊。您可以在這篇文章中找到有關安全密碼散列的所有資訊。

此外,還有一個小問題:“加密”不是您要尋找的術語。加密一個值意味著一種可逆的轉換,例如可以解密結果以恢復原始值。另一方面,散列意味著一種無法輕易逆轉的單向轉換(除了嘗試所有可能的輸入並檢查結果)。

簡短的回答

不要那樣做。它不安全。

長答案

背景

針對基於密碼的系統的攻擊主要分為三種類型:

  • 猜測(例如人的出生日期、妻子的姓名等)
  • 蠻力 - 嘗試所有可能的輸入
  • 字典攻擊

為了防止外部攻擊者(某人無法訪問您的 Web 伺服器,只是它的公共介面),最好的方法是減慢登錄速度,同時為每個使用者實施計數器,例如在 5 次嘗試後將使用者鎖定 5 分鐘,並通過電子郵件向使用者發送通知。

但是,這並不能保護您免受可以訪問您的密碼數據庫的攻擊者的侵害,例如,由於您的密碼數據庫被洩露。很有可能,想想 Yahoo!、eBay、Adobe 等。

為什麼“裸”散列函式不安全?

為了說明問題,假設使用者的密碼為“apple123”。

encrypted_password = sha1("apple123")

encrypted_password是“ec1e7fb8656dba32737acabc2e5a1fb2d02a973f”。

現在搜尋這個雜湊。您將看到的是密碼。如何?Google 破解了 SHA-1 嗎?

明顯不是。那裡有大量的字典,Google可以在其中搜尋。相信我,比發佈到網路上的要好得多。

您可能認為的唯一限制是“好”字典所需的儲存空間。好吧,有一些技術可以顯著減少字典的儲存量(意思是-數百萬次),使用一種稱為Rainbow tables的技術。我不會詳細介紹 if,過度簡化它是一個高度壓縮的密碼/雜湊字典。

另外需要注意的是,一旦密碼數據庫被洩露,攻擊者也有可能通過計算每個可能組合的 SHA-1 來進行暴力破解。需要時間,但使用 GPU

如何防範字典攻擊?

如果你有一個好的彩虹表或其他壓縮字典,它是為一個特定的雜湊函式創建的。因此,防止彩虹表的想法是通過添加一個稱為鹽的公共隨機數來創建多個散列函式 - 數百萬、數十億個散列函式。

salted_password = sha1("apple123 s6589fvj3e785s72o57zd8934sncag4")

鹽需要是隨機的,並且每個使用者都不同。因此,您需要將 salt 儲存在密碼數據庫中 salted_pa​​ssword 旁邊,一旦使用者送出密碼,您就應該計算 salted 版本。

為此,我建議使用 HMAC_SHA_256 和 256 位隨機鹽。

如何使用 CPU 防止暴力攻擊?

這個想法是通過引入大量迭代,在加鹽的基礎上通過“拉伸”人為地減慢雜湊函式。天真的實現是

stretched_password = HMAC_SHA_256(salt, HMAC_SHA_256( salt, HMAC_SHA_256( ..., "apple123"))...)

不要使用幼稚的實現,使用 PBKDFv2 代替它,它也可以防止 CPU 並行化和預計算。

如何使用 GPU 防止暴力攻擊?

不幸的是,簡單的拉伸是不夠的,因為一台簡單的電腦可以擁有數万個處理單元——稱為基於 GPU 的密碼破解。為了減慢 GPU 的速度,計算時使用了大的偽隨機記憶體映射,因為 GPU 處理單元對記憶體的單獨訪問非常非常慢。bcryptscrypt提供針對此類攻擊的保護。

任何進一步的保護

最好的方法是結合使用Password Authenticated Key Exchange或 PAKE 與 scrypt。我個人更喜歡 SRPv6 和 AugPAKE,但也有其他協議。

與前面的範例相比,PAKE 需要客戶端,PAKE 協議的 JavaScript 實現(或使用未廣泛支持的特殊 TLS 擴展),這很難。

如果您對完全實現的安全身份驗證感興趣,可以考慮使用我參與的項目0_kit 。

底線

如果您只想要伺服器,邏輯,請使用scrypt

下一張圖表顯示了原因:問題不再是你能以多快的速度破解密碼,因為你可以建立一個巨大的 GPU 農場,而且顯然比使用 1 個 CPU 更快。Colin Percival做了一個很好的計算(在 2009 年!),你在 1 年內破解密碼需要多少錢。

包含估計成本的表格

如果您想更進一步,請使用SRPAugPAKE,但這也需要客戶端邏輯。

如果你想要安全的密碼認證,所有這些都是現成的,考慮使用0_kit,我參與的一個項目。

引用自:https://crypto.stackexchange.com/questions/40368