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)