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

本文关键字:一个 HMACSHA256 密钥 | 更新日期: 2023-09-27 18:22:01

我希望在我正在构建的API中实现HMACSHA256请求签名。根据我的理解https://www.rfc-editor.org/rfc/rfc4868,密钥最好是与哈希算法相同数量的比特(即SHA256密钥应该是256比特/32字节)。

我可以为C#使用许多不同的随机数生成器中的一个吗?或者有没有一种特定的方法需要生成这些密钥。

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

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

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

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

如果一个键的长度超过HMAC支持的长度,它通常会被散列到合适的大小。这主要是为了支持任意长度的人类可读密钥。如果您是用程序生成密钥的,并且不需要它是可读的,我建议您使用RandomNumberGenerator。这基本上就是它的初衷。

using System.Security.Cryptography;
using RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] data = new byte[32];
rng.GetBytes(data);