HMAC SHA256 的安全性如何
我有一條這種形式的消息(UUID)
406a5830-2a6a-11e6-bdf4-0800200c9a66
。例如,我還使用密鑰0987YGN.?NBVFRTY876JOPOIUHJ$$bvcfghjKFDFGH876TH$
。每 3 秒我使用下面的 java 函式UUID+Time
使用 SHA 256 函式使用密鑰加密。我在網際網路上發布了新結果。由於我每 3 秒就有一個新的雜湊值,所以每個人都可以輕鬆收集大量雜湊值。由於每個 UUID 之間的差異始終為 3000 毫秒,也許這可以讓黑客更容易破解密鑰。我的問題是:一個人有可能猜出我正在使用的密鑰或消息嗎?是否可以計算該系統被黑客入侵的機率?import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class ApiSecurityExample { public static void main(String[] args) { try { String secret = "0987YGN.?NBVFRTY876JOPOIUHJ$$bvcfghjKFDFGH876TH$"; String message = "406a5830-2a6a-11e6-bdf4-0800200c9a66"+System.currentTimeMillis(); Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes())); System.out.println(hash); } catch (Exception e){ System.out.println("Error"); } } }
HMAC-SHA256 非常安全。在問題的使用中,密鑰很大(48 個字元,可能 > 160 位熵)。從理論的角度來看,一切都會檢查。
在 SHA-256 的弱假設下,即使對手可以獲得所選消息的 MAC,HMAC 也具有明顯的抗性(128 位級別)(參見 M. Bellare: New Proofs for NMAC and HMAC: Security without Collision-Resistance,也在 Crypto 2006 的訴訟程序中);因此,可預測性
UUID+Time
不是問題。真正關心的應該是整個協議;和實施相關。像(對於後者),機器可以被pwned,是用無線鍵盤輸入的鍵..
因為我每 3 秒就有一個新的雜湊值,所以每個人都很容易收集大量的雜湊值。而且由於每個 UUID 之間的差異總是 3000 毫秒,也許這可以讓黑客更容易破解密鑰。
閱讀 MAC 設計的安全要求可能會讓您放心。 Handbook of Applied Cryptography的第 9 章是一個很好的免費資源。(第 9.2.2 節是最相關的。)
但是為了簡短起見,好的 MAC 應該能夠抵抗自適應選擇文本攻擊,攻擊者不僅可以看到標籤,還可以:
- 選擇自己喜歡的消息;
- 導致您計算這些消息的標籤;
- 根據他們從早期消息中學到的資訊來選擇消息。
如果該場景中的攻擊者可以學習到足以成功為其他消息偽造標籤而不是他們導致您進行身份驗證的消息,則認為 MAC 已損壞。這種情況比您描述的情況要不利得多,他們只能被動地看到標籤(而沒有消息)。
因此,只要您能保守密鑰的秘密,您可能會有比這更大的安全問題。