はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】ハッシュ関数MD5, SHA1, SHA256, SHA384, SHA512の使い方まとめ

はじめに

今回はハッシュ関数について取り上げたいと思います。

そもそもハッシュ関数(ハッシュアルゴリズム)ってなんやねんと思う方もいると思うので引用を載せておきます。

ハッシュ アルゴリズムは、任意の長さのバイナリ値を、ハッシュ値と呼ばれるより小さい固定長のバイナリ値に変換します。

.NET での暗号化、署名、ハッシュ アルゴリズムの概要 | Microsoft Learn

今回紹介するハッシュアルゴリズムは以下の通り。

  • MD5
  • SHA1
  • SHA256
  • SHA384
  • SHA512

またSHA256SHA384SHA512はまとめてSHA2と呼ばれるそうです。

気をつけてほしいこととして、MD5SHA1は安全でないことが判明しており、SHA2の利用が.NET的には推奨されています。

.NET には、MD5 と SHA1 も用意されています。 ただし、MD5 および SHA-1 アルゴリズムは安全でないことが判明しており、代わりに SHA-2 が推奨されています。 SHA-2 には、SHA256、SHA384、および SHA512 が含まれています。

.NET での暗号化、署名、ハッシュ アルゴリズムの概要 | Microsoft Learn

MD5/SHA1 の競合の問題により、Microsoftは SHA256 または SHA512 を推奨しています。

MD5 クラス (System.Security.Cryptography) | Microsoft Learn

MD5

using HashAlgorithm hashProvider = MD5.Create();
            
byte[] str = Encoding.UTF8.GetBytes("Hello, World!");

byte[] hash = hashProvider.ComputeHash(str);
            
// 101, 168, 226, 125, 136, 121, 40, 56, 49, 182, 100, 189, 139, 127, 10, 212
Console.WriteLine(string.Join(",", hash));
            
// 16 (16bytes * 8 = 128bits)
Console.WriteLine("Length : " + hash.Length);

learn.microsoft.com

ハッシュサイズは128bits固定です。

SHA1

using HashAlgorithm hashProvider = SHA1.Create();
            
byte[] str = Encoding.UTF8.GetBytes("Hello, World!");

byte[] hash = hashProvider.ComputeHash(str);
            
// 10,10,159,42,103,114,148,37,87,171,83,85,215,106,244,66,248,246,94,1
Console.WriteLine(string.Join(",", hash));
            
// 20 (20bytes * 8 = 160bits)
Console.WriteLine("Length : " + hash.Length);

learn.microsoft.com

ハッシュサイズは160bits固定です。

SHA256

using HashAlgorithm hashProvider = SHA256.Create();
            
byte[] str = Encoding.UTF8.GetBytes("Hello, World!");

byte[] hash = hashProvider.ComputeHash(str);
            
// 223,253,96,33,187,43,213,176,175,103,98,144,128,158,195,165,49,145,221,129,199,247,10,75,40,104,138,54,33,130,152,111
Console.WriteLine(string.Join(",", hash));
            
// 32 (32bytes * 8 = 256bits)
Console.WriteLine("Length : " + hash.Length);

learn.microsoft.com

出力は256bits固定です。

SHA384

using HashAlgorithm hashProvider = SHA384.Create();
            
byte[] str = Encoding.UTF8.GetBytes("Hello, World!");

byte[] hash = hashProvider.ComputeHash(str);
            
// 84,133,204,155,51,101,180,48,93,251,78,131,55,224,165,152,165,116,248,36,43,241,114,137,224,221,108,32,163,205,68,160,137,222,22,171,74,179,8,246,62,68,177,23,14,181,245,21
Console.WriteLine(string.Join(",", hash));
            
// 48 (48bytes * 8 = 384bits)
Console.WriteLine("Length : " + hash.Length);

learn.microsoft.com

出力は384bits固定です。

SHA512

using HashAlgorithm hashProvider = SHA512.Create();
            
byte[] str = Encoding.UTF8.GetBytes("Hello, World!");

byte[] hash = hashProvider.ComputeHash(str);
            
// 55,77,121,74,149,205,207,216,179,89,147,24,95,239,155,163,104,241,96,216,218,244,50,208,139,169,241,237,30,90,190,108,198,146,145,224,250,47,224,0,106,82,87,14,241,140,25,222,244,230,23,195,60,229,46,240,166,229,251,227,24,203,3,135
Console.WriteLine(string.Join(",", hash));
            
// 64 (64bytes * 8 = 512bits)
Console.WriteLine("Length : " + hash.Length);
}

learn.microsoft.com

出力は512bits固定です。