11

我正在寻找在我正在构建的 API 中实现 HMACSHA256 请求签名。根据我从https://www.rfc-editor.org/rfc/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)。由于哈希算法被截断,是否有理由使用超过所需的内容?

4

2 回答 2

29

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

var hmac = new HMACSHA256();
var key = Convert.ToBase64String(hmac.Key);
于 2013-07-10T16:28:01.833 回答
9

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

using System.Security.Cryptography;

using RandomNumberGenerator rng = RandomNumberGenerator.Create();

byte[] data = new byte[32];
rng.GetBytes(data);
于 2013-07-10T16:37:10.747 回答