【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する 
2019/12/30 Mon [edit]
簡易的な暗号化として、ハッシュを簡単に生成できる拡張メソッドを定義しておこう。
元々 .NET には色々はハッシュアルゴリズムが System.Security.Cryptography に定義されているのだが、毎回アルゴリズムを選択して書くのは面倒だったりするので、それを省くための拡張メソッドだ。
・System.Security.Cryptography 名前空間
・HashAlgorithm.ComputeHash メソッド
今回紹介する MD5, SHA1, SHA256, SHA384, SHA512 はただ単に生成される文字列の長さを選択したかっただけなので、必要なら色々追加するのも良いかも知れない。実際には、以下の参考記事にもあるが、暗号化として使うには「256ビット以上のハッシュ関数を選択することが望ましい」ともあるので、使い所は選んだ方が良いだろう。
・MD5やSHA1などでハッシュ値を計算する
●ハッシュアルゴリズムを使ってハッシュ値を生成する(拡張メソッド)
using System;
using System.Text;
using System.Security.Cryptography;
public static class HashExtensions //※名前は任意
{
//ハッシュアルゴリズムを使ってハッシュ値を生成する
public static string GenerateHash(this string text, HashAlgorithm hashAlgorithm)
{
if (string.IsNullOrEmpty(text) || hashAlgorithm == null)
return null;
var bytes = Encoding.UTF8.GetBytes(text);
var hash = hashAlgorithm.ComputeHash(bytes);
hashAlgorithm.Clear();
return BitConverter.ToString(hash).ToLower().Replace("-", ""); //小文字にして、'-' をカット(元は XX-XX-…)
}
//MD5 でハッシュ値を生成(32文字)
public static string GenerateHashMD5(this string text)
{
return GenerateHash(text, MD5.Create());
}
//SHA1 でハッシュ値を生成(40文字)
public static string GenerateHashSHA1(this string text)
{
return GenerateHash(text, SHA1.Create());
}
//SHA256 でハッシュ値を生成(64文字)
public static string GenerateHashSHA256(this string text)
{
return GenerateHash(text, SHA256.Create());
}
//SHA384 でハッシュ値を生成(96文字)
public static string GenerateHashSHA384(this string text)
{
return GenerateHash(text, SHA384.Create());
}
//SHA512 でハッシュ値を生成(128文字)
public static string GenerateHashSHA512(this string text)
{
return GenerateHash(text, SHA512.Create());
}
}
●テストコード
string text = "hogehoge";
Console.WriteLine("MD5 : " + text.GenerateHashMD5());
Console.WriteLine("SHA1 : " + text.GenerateHashSHA1());
Console.WriteLine("SHA256 : " + text.GenerateHashSHA256());
Console.WriteLine("SHA384 : " + text.GenerateHashSHA384());
Console.WriteLine("SHA512 : " + text.GenerateHashSHA512());
SHA1 : 3b2c6c10d0e78072d14e02cc4c587814d0f10f3a (40文字)
SHA256 : 4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d (64文字)
SHA384 : 09514da2edaf9e4d083a14136dab995897207f8fb24f362fedc422889f313064cd4cad65e08384770917f809928d3bb2 (96文字)
SHA512 : 2b7e36b16f8a849ef312f9ef5ff9b3f4281a8681d0657150899f1113a0eecfdbb4491da763159055b55e122e85281415b11897d268e124f9ef2b40457a63a465 (128文字)
あくまでもサクッと使いたい時用に。MD5 はパリティ用などによく使われるね。ハッシュは一方向関数なので、パスワードの暗号化にも使われる(元に戻せないので、次回入力したものをハッシュ化して比較する。復号化したいものには使えないが、逆算は難しいメリットがある → 復号化したいときはこっち)。実際の暗号化には DES や AES (Rijndael) などがよく使われるけどね。
・【Unity】【C#】文字列の暗号化・復号化を行う
暗号化としては SHA512 の方がもちろん強固だろうけど、文字列はとても長くなるので、利用時にはその辺りがネックになるかな(例えば、データベースで長さ制限のある文字列型を使ってる場合は注意)。
とは言え、「Google が量子コンピュータを完成させた」みたいな話題もあったから、いつか暗号化アルゴリズムそのものを考え直す時代が来るかもね…(笑)。
・Googleが1万年かかる計算問題を3分20秒で解き終える量子コンピューターを完成させる
(関連記事)
【C#】GUID の生成と書式
【Unity】【C#】文字列の暗号化・復号化を行う
- 関連記事
-
-
【C#】クラスのフィールド名を文字列の配列で取得する
-
【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
-
【C#】文字列 → float (浮動小数点) 変換でエラーが出るときは…
-
【C#】HashSet や Dictionary の AddRange
-
【C#】二分探索の実装(範囲インデクス指定実装)
-
category: C#
thread: プログラミング
janre: コンピュータ
tag: C#ライブラリ 暗号化| h o m e |