兩輪SHA-256 HMAC?
在我們正在進行的一個項目中,我們的數據中心內有兩個應用程序可以交換消息。消息受 HMAC 保護,密鑰儲存在 SafeNet 設備上。
更新
這不是硬體令牌 - 它是一種稱為“StorageSecure”的強化網路儲存設備。密鑰儲存在 SafeNet 設備上的 SafeNet“加密器”中。
密鑰由應用程序#1 從 SafeNet 檢索,以計算與應用程序 #2 交換的消息的 HMAC。應用 #2 還具有對同一 SafeNet 設備的讀取訪問權限,並檢索相同的密鑰以驗證從應用 #1 接收到的消息的 HMAC。
為了保護該過程免受 SafeNet 機密被洩露以及不良行為者可能注入虛假消息的影響,我想研究在該過程中添加一個額外的“因素”。在 App #1 和 App #2 的公式中添加第二輪 HMAC 是否有任何好處,可能使用程式碼中用於第二個 HMAC 中的鍵的靜態鍵值,例如:
HMAC(HMAC(Message,SafeNetSecretKey),StaticKey)
或者將靜態密鑰用作添加到消息中的鹽會更好:
HMAC(Message+StaticKey,SafeNetSecretKey)
更新
或者由於這些消息是由 App1 通過 Web 服務發送到 App2 的,我們是否可以考慮讓 App1 計算一個 nonce 並在 HMAC 的計算中使用該 nonce,例如 HMAC(SafeNet_K1 || Nonce, Message) 並將該 nonce 傳遞給 app2 Https 請求的正文?
非常感謝任何建議!
首先,您應該始終使用 HMAC,將秘密數據作為密鑰,將(可能)公共數據作為消息。其安全性的證明依賴於此。因此,與其將靜態密鑰連接到消息,您可能需要考慮將其連接到密鑰。
其次,額外的雜湊不會增加任何安全性。任何知道密鑰的人都可以像單獨使用 HMAC 一樣輕鬆計算它。這只是一小層混淆——你依賴於攻擊者而不是嘗試它。
因此,表示“密鑰” $ k_1 $ 和“共享密鑰” $ k_2 $ ,至少有三個選項:
- $ H_{k_2}(H_{k_1}(m)) $ ,您首先使用密鑰,然後使用共享密鑰。
- $ H_{k_1}(H_{k_2}(m)) $ , 你做相反的事情。
- $ H_{k_1||k_2}(m) $ ,其中鍵是連接的。
前兩個在您使用密鑰的順序上有所不同。這很重要的原因是知道內部密鑰的攻擊者可以使用衝突搜尋來攻擊整個 MAC。如果內部 HMAC 發生衝突,則外部 HMAC 也會發生衝突。這僅在 HMAC 雜湊缺乏抗碰撞性時才重要,但通常不需要抗碰撞性,因此即使使用 SHA-256 之類的東西,理論上它也比必要的要弱。
最後一個是最節儉的,因為您只需要一個 HMAC 呼叫。即使對於知道其中一個密鑰的攻擊者,它也應該是安全的。這是我會推薦的。
nonce 的想法不會增加安全性,除非你可以檢查它的唯一性,在這種情況下你可以避免重放攻擊。對於隨機隨機數,您需要將它們全部儲存以檢查它們是否唯一,或者您可以讓 App2 生成它並將其發送給 App1 使用,從而增加延遲。使用遞增計數器只需要儲存先前的值(但您需要以某種方式處理失去的消息)。
在重放攻擊中,沒有上下文資訊的經過身份驗證的消息可以在以後被攻擊者複製和發送。您是否需要隨機數來避免它取決於您的消息包含哪些資訊以及再次發送其中一個是否會構成攻擊。
如果您確實使用了 nonce,它可能應該與消息而不是密鑰連接,因為 nonce 是公共資訊。