Hmac

HMAC 密鑰生成和編碼

  • September 20, 2021

我有這段 .NET 程式碼,它基於一個關於如何使用 HMACSH256 生成密鑰和簽名的 Microsoft 範例

但是我稍微改變了密鑰生成,並決定使用 Base64 將密鑰作為字元串傳輸:

密鑰生成:

byte[] secretkey = new Byte[64];

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   rng.GetBytes(secretkey);
   using (SHA512 mySHA256 = SHA512.Create())
   {
         var hashedKey = mySHA256.ComputeHash(secretkey);
         var encodedKey = Convert.ToBase64String(hashedKey);
         return encodedKey;
   }
}

因此,除了生成隨機字節之外,我還決定使用 SHA512 對密鑰進行雜湊處理。然後 Base64 編碼得到最終的字元串表示,這將只用於傳輸,因為在使用之前,消息的接收者將解碼回 SHA512 摘要。

我這樣做的方式有什麼問題嗎?除非我弄錯了,否則所有散列都會引入更多隨機性,因為密鑰將保持 64 字節長度。這值得麼?

另外,將密鑰作為 Base64 字元串傳輸有什麼問題嗎?

謝謝,我希望有人可以對此提供一些回饋。祝你有個好的一天!

散列所做的只是引入更多的隨機性

不,您不能通過確定性過程引入隨機性。您只能使用隨機數據的實際來源引入隨機性。

您可以將散列用作偽隨機生成器的組件,並且(加密安全!)偽隨機生成器對於需要隨機性的密碼學來說已經足夠好了,但偽隨機生成器的另一個重要組件是秘密。這個秘密就是隨機生成器的狀態,它來自隨機種子:偽隨機生成器不會產生隨機性,它只會“乘”它,因為它可以將少量隨機數據變成大量隨機數據數據。

對隨機字元串進行散列只會降低其隨機性:理論上兩個輸入字元串可能具有相同的散列(您實際上不會找到這樣的字元串,我們不確定它們是否存在,但很有可能它們確實存在)。隨機性僅減少了很小的量,因此這不是程式碼中的實際漏洞,但它是不必要且適得其反的並發症。

最大化隨機性的方法是從隨機生成器中獲取輸出。打電話rng.GetBytes(secretkey)並停在那裡。

將密鑰轉換為 Base64 以進行傳輸,然後再轉換回二進制以供使用,對密碼學沒有影響。這只是一種編碼。進行解碼:使用 Base64 作為密鑰可能會降低安全性,因為每個字節只能有 1/4 的可能值。(HMAC 使用其密鑰的方式,實際上是使用base64(random_bytes(64))還是random_bytes(64)作為密鑰並不重要;但這對於例如 AES 密鑰來說很重要,它甚至沒有可接受的長度。)

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