Сгенерируйте сильный ключ HMACSHA256 в C#


Я ищу, чтобы реализовать hmacsha256 запрос подписи в API, который я строю. Из того, что я понял из 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 8

2 ответа:

Если ключ длиннее, чем поддерживает HMAC, он обычно хэшируется до нужного размера. В основном это делается для поддержки удобочитаемых ключей произвольной длины. Если вы генерируете ключ программно и вам не нужно, чтобы он был удобочитаемым, я бы рекомендовал использовать RandomNumberGenerator. Это в основном то, для чего он был сделан.

using System.Security.Cryptography;

RandomNumberGenerator rng = RandomNumberGenerator.Create();

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

Один из способов сгенерировать (предположительно безопасный) ключ:

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