2013-07-10 4 views
6

私が構築しているAPIでHMACSHA256リクエストの署名を実装しようとしています。私がhttps://tools.ietf.org/html/rfc4868から理解したところでは、秘密鍵はハッシュアルゴリズムと同じ数のビットであることがベストです(つまり、SHA256秘密鍵は256ビット/ 32バイトでなければなりません)。C#で強力なHMACSHA256キーを生成する

C#のためにさまざまな乱数生成器を使用することができますが、これらのキーを生成する必要がある特定の方法がありますか。

最後に、Amazon WebサービスはHMACSHA256を使用しますが、(少なくとも私にとって)秘密鍵は320ビット/ 40バイトです(キーがUTF-8を使用してバイトに変換された場合はhttps://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232を参照)。それが切り捨てられているので、ハッシュアルゴリズムによって必要以上に使用する理由はありますか? (おそらく安全な)キーを生成するための

答えて

5

場合、それは通常、適切なサイズにハッシュされます。これは、主に、人間が読める任意の長さのキーをサポートすることです。プログラマチックに鍵を生成しており、人間が読めるようにする必要がない場合は、RandomNumberGeneratorを使用することをお勧めします。これは基本的にそれが作られたものです。

using System.Security.Cryptography; 

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 

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

一つの方法は次のとおりです。鍵はHMACをサポートしているよりも長い

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

Base64はHexと同じではありません。IEでは、変数名が誤解を招きます。 – Peter

+1

@Peter、それを指摘してくれてありがとう、私は変数名を変更しました。 – Omar

関連する問題