Encryption

我的方法有多安全

  • January 16, 2020

我正在建立一個網站。我有一個帶有 2 個參數的 API:delete_user(user_id, hash)。

還有一種使用 SHA512 評估雜湊的方法:

String hash(String user_id)
{
  String key = "23jfk3jf...343fk";
  return SHA512(user_id + SHA512(key));  
}

第二種驗證方法:

bool validate(String user_id, String hash)
{
  if(hash(user_id) == hash)
  {
       return true;
  }
  else return false;
}
  1. 每個使用者都知道他的 user_id 和他的 user_id 的雜湊值。
  2. user_id 的長度為 K 個符號
  3. 雜湊方法中的鍵有 M 個符號
  4. hash 方法對使用者不公開,但 validate 方法是。

使用者是否很難找到任何對(String user_id,String hash),驗證將返回true(當然,user_id不是他自己帳戶的user_id)。假設 K = 10 和 M = 50?

這是對雜湊函式的原像攻擊,即

  • **原像攻擊:**給定一個雜湊值 $ y $ 找到原像 $ x $ 這樣 $ y=h(x) $ .

設計良好的密碼散列函式具有 $ \mathcal{O}(2^{n}) $ 經典的原像電阻 $ n $ 位輸出。經典攻擊嘗試所有可能的輸入空間來找到一個 $ x $ 散列目標散列值。由於生日悖論,我們不期望所有值都存在於 $ 2^n $ 位空間。有些會發生不止一個。這不會改變複雜性。

假設您使用base64 編碼來儲存值,則字元串中的每個位置都可能是 64 位雜湊字元(= 用於填充)。

專注於一個目標user_id,攻擊者將搜尋 50 個字元的鍵空間進行匹配。$$ \text{hash} \stackrel{?}{=}\operatorname{SHA512}(\text{user_id}, \operatorname{SHA512}(key_i) $$這將使 $ 64^{50} = 2^{6\cdot 50} = 2^{300} $ 對於任何可用的計算能力來說,這是一個巨大的數字。如果您使用其他編碼,您可以調整這些值。

雜湊函式旨在快速執行。如果有的話,這也會使攻擊時間變快。您可以通過迭代使其變慢,也可以使用現有的解決方案,如 HKDF、PBKDF2 等。它們有迭代來增加攻擊時間。

除了有一些考慮之外,您的計劃似乎還不錯;

  • 已經有HMAC(基於雜湊的消息驗證碼或密鑰雜湊消息驗證碼)。Bellare, Mihir(2006 年 6 月)證明了它的安全性。NMAC 和 HMAC 的新證明:假設壓縮函式為 PRF 下的無碰撞安全性的安全性。

您也可以將 HMAC 與 SHA512 一起使用。如果大小不是問題,您可以使用 HMAC-SHA512 的完整輸出(或您的方案)

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