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

Oma*_*mar 9 c# hmac

我正在寻找在我正在构建的API中实现HMACSHA256请求签名.从我地理解https://tools.ietf.org/html/rfc4868,这是最好的秘密密钥是相同的位数的哈希算法(即SHA256密钥应该是256比特/ 32字节).

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

最后,亚马逊Web服务使用HMACSHA256,但他们提供的(至少对我来说)密钥是320比特/ 40字节(当关键是使用转换为字节UTF-8,看https://github.com/aws/ AWS-SDK-净/斑点/主/ AWSSDK/Amazon.Runtime /内部/认证/ AWS4Signer.cs#L205-L232).有没有理由使用散列算法超过需要,因为它被截断了?

Oma*_*mar 22

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

var hmac = new HMACSHA256();
var key = Convert.ToBase64String(hmac.Key);
Run Code Online (Sandbox Code Playgroud)


Cor*_*son 8

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

using System.Security.Cryptography;

RandomNumberGenerator rng = RandomNumberGenerator.Create();

byte[] data = new byte[32];
rng.GetBytes(data);
Run Code Online (Sandbox Code Playgroud)