C# ハッシュ値を取得するサンプル

C#のハッシュ値を取得するサンプルです。

目次

サンプル ハッシュ値とは
  SHA-256のサンプル
  MD5のサンプル

ハッシュ値とは

ハッシュ値のイメージ:
fdb481ea956fdb654afcc327cff9b626966b2abdabc3f3e6dbcb1667a888ed9a

ハッシュ値は、文字列からハッシュ値へ変換した場合、そのハッシュ値から元の文字列に戻すことはできないという特徴があります。

使用例としてWEBシステムでユーザが入力したパスワードをハッシュ値にしてDBに保存し
再度ユーザがログインした時、入力されたパスワードをハッシュ値にしてDBにあるハッシュ値と比較し確認する等あります。パスワードをDBにそのまま保存するより良くなります。

また通常はソルト(salt:塩)を使用します。ソルトとは、元のデータに任意の文字列を付加してからハッシュ値にすることでセキュリティの強度を高めます。

さらに安全性を高める場合は、ストレッチング(ハッシュ値の計算を繰り返し行う)を行います。

以下は、MicroSoftのハッシュ値計算のリンクです。
https://docs.microsoft.com/ja-jp/troubleshoot/dotnet/csharp/compute-hash-values

SHA-256のサンプル

SHA-256は、256bitのハッシュ値(64桁)を出力します。よく使用されています。256以上が推奨です。

using System;
using System.Security.Cryptography;
using System.Text;

class Test1
{
	static void Main()
	{
		Console.WriteLine(class1.GetHashValue("あいうえお"));
		//fdb481ea956fdb654afcc327cff9b626966b2abdabc3f3e6dbcb1667a888ed9a

		Console.WriteLine(class1.GetHashValue("あいうABC123"));
		//eac7b740f6b015b37fcf86d3c7ca404caa84d1ab4ea2d9974d4ad0d410f38b9a
	}
	static class class1
	{
		public static string GetHashValue(string str1)
		{
			byte[] ar1 = Encoding.UTF8.GetBytes(str1);
			byte[] ar2 = 
				new SHA256CryptoServiceProvider().ComputeHash(ar1);

			// バイト配列 → 16進数文字列
			var str2 = new StringBuilder();
			foreach (byte b1 in ar2)
			{
				str2.Append(b1.ToString("x2"));
			}
			return str2.ToString();
		}
	}
}

ComputeHashメソッドは、バイト配列のハッシュ値を計算します。
ToString("x2")は例として10進数の11は、16進数の0bになります。
ToString("x4")は例として10進数の11は、16進数の000bになります。

MD5のサンプル

MD5は、128bitのハッシュ値(32桁)を出力します。安全性は低いです。

using System;
using System.Security.Cryptography;
using System.Text;

class Test1
{
	static void Main()
	{
		Console.WriteLine(class1.GetHashValue("あいうえお"));
		//86deb27a32903da70a7b2348fcf36bc3

		Console.WriteLine(class1.GetHashValue("あいうABC123"));
		//5275d678c4f68d2c2ff37c25c842378e
	}
	static class class1
	{
		public static string GetHashValue(string str1)
		{
			byte[] ar1 = Encoding.UTF8.GetBytes(str1);
			byte[] ar2 = 
				new MD5CryptoServiceProvider().ComputeHash(ar1);

			// バイト配列 → 16進数文字列
			var str2 = new StringBuilder();
			foreach (byte b1 in ar2)
			{
				str2.Append(b1.ToString("x2"));
			}
			return str2.ToString();
		}
	}
}

関連の記事

C# for文 処理を繰り返すサンプル(break/continue)
C# foreach文のサンプル(break/continue)

△上に戻る