在C#中生成强HMACSHA256密钥

11

我想在构建的API中实现HMACSHA256请求签名。根据我从https://www.rfc-editor.org/rfc/rfc4868了解到的,最好将密钥与哈希算法具有相同的位数(即,SHA256秘密密钥应为256位/32个字节)。

我可以使用C#中许多不同的随机数生成器之一,还是这些密钥需要以特定方式生成。

最后,亚马逊网络服务(AWS)使用HMACSHA256,但它们提供的秘密密钥(至少是对我而言)为320位/40个字节(当使用UTF-8将密钥转换为字节时,请参见https://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232)。由于被截断,是否有理由使用比哈希算法所需更多的位数?

2个回答

29

生成(大概)安全密钥的一种方法是:

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

1
Base64不同于十六进制,即你的变量名是误导性的。 - Peter
1
@Peter,谢谢你指出来,我已经修改了变量名。 - Omar

10

如果一个密钥比HMAC支持的长度还长,通常会被哈希到正确的大小。这主要是为了支持任意长度的可读性强的密钥。如果您正在编程生成密钥,并且不需要它可读性强,我建议使用RandomNumberGenerator。这基本上就是它的作用。

using System.Security.Cryptography;

using RandomNumberGenerator rng = RandomNumberGenerator.Create();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接