はじめに
今回はハッシュ関数について取り上げたいと思います。
そもそもハッシュ関数(ハッシュアルゴリズム)ってなんやねんと思う方もいると思うので引用を載せておきます。
ハッシュ アルゴリズムは、任意の長さのバイナリ値を、ハッシュ値と呼ばれるより小さい固定長のバイナリ値に変換します。
.NET での暗号化、署名、ハッシュ アルゴリズムの概要 | Microsoft Learn
今回紹介するハッシュアルゴリズムは以下の通り。
- MD5
- SHA1
- SHA256
- SHA384
- SHA512
またSHA256
・SHA384
・SHA512
はまとめてSHA2
と呼ばれるそうです。
気をつけてほしいこととして、MD5
とSHA1
は安全でないことが判明しており、SHA2
の利用が.NET
的には推奨されています。
.NET には、MD5 と SHA1 も用意されています。 ただし、MD5 および SHA-1 アルゴリズムは安全でないことが判明しており、代わりに SHA-2 が推奨されています。 SHA-2 には、SHA256、SHA384、および SHA512 が含まれています。
.NET での暗号化、署名、ハッシュ アルゴリズムの概要 | Microsoft Learn
MD5/SHA1 の競合の問題により、Microsoftは SHA256 または SHA512 を推奨しています。
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);
ハッシュサイズは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);
ハッシュサイズは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);
出力は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);
出力は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); }
出力は512bits
固定です。