2017-04-10 195 views
1

我使用AES進行生物HMAC簽名API調用,雖然我明白隨機數是什麼,爲什麼他們是重要的,我對它們究竟註定這裏有點困惑將要執行。AES:使用隨機數來創建新的密鑰HMAC

我不得不使用隨機數來改變客戶機的密鑰生成一個新的單次使用的密鑰來簽署,否則會與重放攻擊很容易地利用電話的想法。

的基本前提是用戶,當他們登錄誰得到密鑰,調用創建並返回一個TRANSACTIONID和一個新的隨機數的設置API過程。然後用戶將他們自己的密鑰和隨機數組合在一起來簽署TransactionID和其他一些事情。服務器然後嘗試使用該用戶的當前活動的隨機數來匹配此簽名。

服務器自動清除舊的隨機數並在新的設置調用完成時覆蓋它們,因此用戶必須始終遵循此配對序列(不能重複使用第二個調用,因爲舊的隨機數將被刪除,服務器將不再接受此簽名)。

如果這是使用隨機數的有效方式,我該如何與客戶機的密鑰相結合他們得到一個有效的祕密密鑰?

我產生AES商這樣說:

private static AesCryptoServiceProvider GetProvider(byte[] key, byte[] IV) 
    { 
     AesCryptoServiceProvider result = new AesCryptoServiceProvider(); 
     result.BlockSize = 128; 
     result.KeySize = 256; 
     result.Mode = CipherMode.CBC; 
     result.Padding = PaddingMode.PKCS7; 

     result.IV = IV; 
     result.Key = key; 

     return result; 
    } 

我使用AES-256,所以我的鑰匙始終是32字節長。但是,如果我想用隨機數以創建一個新的關鍵,我不能簡單地將它們連接起來,因爲生成的字符串將不再是32個字節。

我應該串聯,然後使用一個固定長度的散列函數來得到的結果返回到一個32字節的長度?或者是否有一個AESCryptoServiceProvider構造函數/方法可以自動處理我失蹤的隨機數? 或者我只是應該將明文附加到簽名並讓服務器分別讀取它們並直接檢查它們?

+0

如果給定的答案解決了您的問題,您可以[接受](https://meta.stackexchange.com/q/5234/266187)它。如果沒有,請詳細說明哪裏出了問題。 –

回答

1

有很多方法可以解決這個問題。最簡單的就是使用哈希。您可以使用HMAC甚至HKDF

SessionKey = HMAC_SHA256(SecretKey, Nonce) 

請務必使用用戶的SecretKey來派生其他密鑰。如果你想用這個推導不同的東西,那麼你需要的使用綁定到鍵:

SessionKey = HMAC_SHA256(SecretKey, "Encryption".Concat(Nonce)) 
SessionToken = HMAC_SHA256(SecretKey, "Token".Concat(Nonce)) 

這僅僅是僞代碼。 Here是C#中實際HMAC的一些示例。