在C#中生成一个强大的HMACSHA256密钥

时间:2013-07-10 16:26:44

标签: c# hmac

我希望在我正在构建的API中实现HMACSHA256请求签名。根据我从https://tools.ietf.org/html/rfc4868的理解,秘密密钥最好与散列算法的位数相同(即SHA256密钥应为256位/ 32字节)。

我可以在C#中使用许多不同的随机数生成器之一,或者是否需要生成这些密钥的具体方法。

最后,Amazon Web Services使用HMACSHA256,但是他们提供的密钥(至少对我来说)是320位/ 40字节(当使用UTF-8将密钥转换为字节时,请参阅https://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232)。是否有理由使用散列算法超出需要,因为它被截断了?

2 个答案:

答案 0 :(得分:20)

生成(可能是安全的)密钥的一种方法是:

var hmac = new HMACSHA256();
var key = Convert.ToBase64String(hmac.Key);

答案 1 :(得分:8)

如果密钥长于HMAC支持,则通常将其散列到适当的大小。这主要是为了支持任意长度的人类可读键。如果您以编程方式生成密钥并且不需要它是人类可读的,我建议使用RandomNumberGenerator。这基本上就是为它制作的。

using System.Security.Cryptography;

RandomNumberGenerator rng = RandomNumberGenerator.Create();

byte[] data = new byte[32];
rng.GetBytes(data);