FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »暗号化
このページの記事一覧

【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する  


 簡易的な暗号化として、ハッシュを簡単に生成できる拡張メソッドを定義しておこう。

 元々 .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());

MD5 : 329435e5e66be809a656af105f42401e  (32文字)
SHA1 : 3b2c6c10d0e78072d14e02cc4c587814d0f10f3a  (40文字)
SHA256 : 4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d  (64文字)
SHA384 : 09514da2edaf9e4d083a14136dab995897207f8fb24f362fedc422889f313064cd4cad65e08384770917f809928d3bb2  (96文字)
SHA512 : 2b7e36b16f8a849ef312f9ef5ff9b3f4281a8681d0657150899f1113a0eecfdbb4491da763159055b55e122e85281415b11897d268e124f9ef2b40457a63a465  (128文字)

 あくまでもサクッと使いたい時用に。MD5 はパリティ用などによく使われるね。ハッシュは一方向関数なので、パスワードの暗号化にも使われる(元に戻せないので、次回入力したものをハッシュ化して比較する。復号化したいものには使えないが、逆算は難しいメリットがある → 復号化したいときはこっち)。実際の暗号化には DESAES (Rijndael) などがよく使われるけどね。

【Unity】【C#】文字列の暗号化・復号化を行う

 暗号化としては SHA512 の方がもちろん強固だろうけど、文字列はとても長くなるので、利用時にはその辺りがネックになるかな(例えば、データベースで長さ制限のある文字列型を使ってる場合は注意)。

 とは言え、「Google が量子コンピュータを完成させた」みたいな話題もあったから、いつか暗号化アルゴリズムそのものを考え直す時代が来るかもね…(笑)。

Googleが1万年かかる計算問題を3分20秒で解き終える量子コンピューターを完成させる





(関連記事)
【C#】GUID の生成と書式
【Unity】【C#】文字列の暗号化・復号化を行う


関連記事
スポンサーサイト



category: C#

thread: プログラミング

janre: コンピュータ

tag: C#ライブラリ  暗号化 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR