DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

MD5やSHA1などでハッシュ値を計算する

ここでは、認証やデジタル署名、ファイルが改ざんされていないことの確認などに使用される、MD5(Message Digest 5)やSHA1(Secure Hash Algorithm 1)などのハッシュ値を計算する方法を説明します。

注意:現在では、あるMD5ハッシュ値と同じハッシュ値のデータを作成することが比較的容易にできます。また、SHA1についても脆弱性が指摘されています。電子政府推奨暗号リストにはMD5は入っておらず、SHA1やRIPEMD-160も注釈として「256ビット以上のハッシュ関数を選択することが望ましい」としています。

文字列のMD5ハッシュ値を計算する

MD5CryptoServiceProviderクラスを使用すれば、MD5ハッシュ値を計算することができます。

下の例では、文字列のMD5ハッシュ値を計算し、結果を16進数の数字で出力します。なお文字列をバイト型配列に変換する方法については、「文字列をバイト型配列に変換する」をご覧ください。

VB.NET
コードを隠すコードを選択
'MD5ハッシュ値を計算する文字列
Dim s As String = "<1896.697170952@dbc.mtview.ca.us>tanstaaf"
'文字列をbyte型配列に変換する
Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes(s)

'MD5CryptoServiceProviderオブジェクトを作成
Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider()
'または、次のようにもできる
'Dim md5 As System.Security.Cryptography.MD5 = _
'    System.Security.Cryptography.MD5.Create()

'ハッシュ値を計算する
Dim bs As Byte() = md5.ComputeHash(data)

'リソースを解放する
md5.Clear()

'byte型配列を16進数の文字列に変換
Dim result As New System.Text.StringBuilder()
Dim b As Byte
For Each b In bs
    result.Append(b.ToString("x2"))
Next b
'ここの部分は次のようにもできる
'Dim result As String = BitConverter.ToString(bs).ToLower().Replace("-", "")

'結果を表示
Console.WriteLine(result)
C#
コードを隠すコードを選択
//MD5ハッシュ値を計算する文字列
string s = "<1896.697170952@dbc.mtview.ca.us>tanstaaf";
//文字列をbyte型配列に変換する
byte[] data = System.Text.Encoding.UTF8.GetBytes(s);

//MD5CryptoServiceProviderオブジェクトを作成
System.Security.Cryptography.MD5CryptoServiceProvider md5 =
    new System.Security.Cryptography.MD5CryptoServiceProvider();
//または、次のようにもできる
//System.Security.Cryptography.MD5 md5 =
//    System.Security.Cryptography.MD5.Create();

//ハッシュ値を計算する
byte[] bs = md5.ComputeHash(data);

//リソースを解放する
md5.Clear();

//byte型配列を16進数の文字列に変換
System.Text.StringBuilder result = new System.Text.StringBuilder();
foreach (byte b in bs)
{
    result.Append(b.ToString("x2"));
}
//ここの部分は次のようにもできる
//string result = BitConverter.ToString(bs).ToLower().Replace("-","");

//結果を表示
Console.WriteLine(result);

このコードを実行した結果は、「c4c9334bac560ecc979e58001b3e22fb」のようになります。

SHA1、SHA256、SHA384、SHA512ハッシュ値を計算する

.NET Frameworkでは、MD5CryptoServiceProviderの他にもいくつかのハッシュアルゴリズムを実装したクラスが用意されています。これらを使って、SHA1、SHA256、SHA384、SHA512ハッシュ値を計算することができます。使い方は、上記のMD5CryptoServiceProviderクラスを使った方法と同じです。

以下に、このようなクラスを紹介します。

クラス名 説明(MSDNより)
SHA1Managed マネージ ライブラリを使用して、入力データの SHA1 ハッシュを計算します。
SHA256Managed マネージ ライブラリを使用して、入力データの SHA256 ハッシュを計算します。
SHA384Managed マネージ ライブラリを使用して、入力データの SHA384 ハッシュを計算します。
SHA512Managed マネージ ライブラリを使用して、入力データの SHA512 ハッシュを計算します。
RIPEMD160Managed マネージ ライブラリを使用して、入力データの RIPEMD160 ハッシュを計算します。.NET Framework 2.0以上。
MD5CryptoServiceProvider 暗号化サービス プロバイダー (CSP: cryptographic service provider) によって提供された実装を使用して、入力データの MD5 ハッシュ値を計算します。
SHA1CryptoServiceProvider 暗号化サービス プロバイダー (CSP: cryptographic service provider) によって提供された実装を使用して、入力データの SHA1 ハッシュ値を計算します。
SHA256CryptoServiceProvider SHA256 アルゴリズムの暗号サービス プロバイダー (CSP: Cryptographic Service Provider) 実装にアクセスするためのラッパー オブジェクトを定義します。.NET Framework 3.5以上。Windows Vista、Windows Server 2003以上。
SHA384CryptoServiceProvider SHA384 アルゴリズムの暗号サービス プロバイダー (CSP: Cryptographic Service Provider) 実装にアクセスするためのラッパー オブジェクトを定義します。.NET Framework 3.5以上。Windows Vista、Windows Server 2003以上。
SHA512CryptoServiceProvider SHA512 アルゴリズムの暗号サービス プロバイダー (CSP: Cryptographic Service Provider) 実装にアクセスするためのラッパー オブジェクトを定義します。.NET Framework 3.5以上。Windows Vista、Windows Server 2003以上。
MD5Cng メッセージ ダイジェスト 5 (MD5: Message Digest 5) 128 ビット ハッシュ アルゴリズムの CNG (Cryptography Next Generation) 実装を提供します。.NET Framework 3.5以上。Windows Vista、Windows Server 2008以上。
SHA1Cng セキュア ハッシュ アルゴリズム (SHA: Secure Hash Algorithm) の CNG (Cryptography Next Generation) 実装を提供します。.NET Framework 3.5以上。Windows Vista、Windows Server 2008以上。
SHA256Cng 256 ビットのハッシュ値を得るために、セキュア ハッシュ アルゴリズム (SHA: Secure Hash Algorithm) の CNG (Cryptography Next Generation) 実装を提供します。.NET Framework 3.5以上。Windows Vista、Windows Server 2008以上。
SHA384Cng 384 ビットのハッシュ値を得るために、セキュア ハッシュ アルゴリズム (SHA: Secure Hash Algorithm) の CNG (Cryptography Next Generation) 実装を提供します。.NET Framework 3.5以上。Windows Vista、Windows Server 2008以上。
SHA512Cng 512 ビットのハッシュ値を得るために、セキュア ハッシュ アルゴリズム (SHA: Secure Hash Algorithm) の CNG (Cryptography Next Generation) 実装を提供します。.NET Framework 3.5以上。Windows Vista、Windows Server 2008以上。
補足:SHA1CryptoServiceProviderクラスとSHA1Managedクラスの違いは、SHA1CryptoServiceProviderクラスが暗号化サービスプロバイダ(CSP、cryptographic service provider)を使用しているのに対して、SHA1Managedクラスは完全にマネージコードで計算します。また、SHA1CngはCNG(Cryptography Next Generation)を使用しています。

HashPasswordForStoringInConfigFileメソッドを使用して、MD5やSHA1を計算する

さらに次のようにFormsAuthentication.HashPasswordForStoringInConfigFileメソッドを使用して、MD5とSHA1のハッシュ値を計算することができます。前述した方法と比較すると、このメソッドは文字列のハッシュ計算しかできません。文字列をUTF8でバイト型配列にエンコードし、それを前述したような方法で計算したハッシュ値と同じ結果になります。

以下にMD5ハッシュ値を計算する例を示します。このコードを実行するには、「参照設定」に「System.Web.dll」を追加する必要があります。

VB.NET
コードを隠すコードを選択
Dim s As String = "<1896.697170952@dbc.mtview.ca.us>tanstaaf"
Dim result As String

result = System.Web.Security.FormsAuthentication. _
    HashPasswordForStoringInConfigFile(s, "md5").ToLower()
Console.WriteLine(result)
C#
コードを隠すコードを選択
string s = "<1896.697170952@dbc.mtview.ca.us>tanstaaf";
string result;

result = System.Web.Security.FormsAuthentication.
    HashPasswordForStoringInConfigFile(s, "md5").ToLower();
Console.WriteLine(result);

SHA1ハッシュを計算する場合は、FormsAuthentication.HashPasswordForStoringInConfigFileメソッドの2番目の引数を"sha1"にします。

MAC、HMACを計算する

.NET Frameworkには、MAC(Message Authentication Code、メッセージ認証符号)や、HMAC(Keyed-Hashing for Message Authentication Code、ハッシュ ベース メッセージ認証符号)を計算するためのクラスも用意されています。MACTripleDESクラスでTripleDESを使用したMACを、HMACSHA1クラスでSHA1を使用したHMACを計算できます。

以下にHMACSHA1クラスを使ってHMAC-SHA1を計算する例を示します。

VB.NET
コードを隠すコードを選択
'HMAC-SHA1を計算する文字列
Dim s As String = "<1896.697170952@dbc.mtview.ca.us>tanstaaf"
'キーとする文字列
Dim key As String = "password"

'文字列をバイト型配列に変換する
Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes(s)
Dim keyData As Byte() = System.Text.Encoding.UTF8.GetBytes(key)

'HMACSHA1オブジェクトの作成
Dim hmac As New System.Security.Cryptography.HMACSHA1(keyData)
'ハッシュ値を計算
Dim bs As Byte() = hmac.ComputeHash(data)
'リソースを解放する
hmac.Clear()

'Byte型配列を16進数に変換
Dim result As String = BitConverter.ToString(bs).ToLower().Replace("-", "")

'結果を表示
Console.WriteLine(result)
C#
コードを隠すコードを選択
//HMAC-SHA1を計算する文字列
string s = "<1896.697170952@dbc.mtview.ca.us>tanstaaf";
//キーとする文字列
string key = "password";

//文字列をバイト型配列に変換する
byte[] data = System.Text.Encoding.UTF8.GetBytes(s);
byte[] keyData = System.Text.Encoding.UTF8.GetBytes(key);

//HMACSHA1オブジェクトの作成
System.Security.Cryptography.HMACSHA1 hmac =
    new System.Security.Cryptography.HMACSHA1(keyData);
//ハッシュ値を計算
byte[] bs = hmac.ComputeHash(data);
//リソースを解放する
hmac.Clear();

//byte型配列を16進数に変換
string result = BitConverter.ToString(bs).ToLower().Replace("-", "");

//結果を表示
Console.WriteLine(result);

.NET Framework 2.0からは、以下のようなクラスを使って、HMAC-MD5なども計算できるようになりました。使い方は上の例と同じです。

クラス名 説明(MSDNより) 補足(MSDNより)
MACTripleDES TripleDES を使用して、入力データ CryptoStream の MAC (Message Authentication Code) を計算します。 長さが 16 または 24 バイトのキーを使用し、長さが 8 バイトのハッシュ シーケンスを生成
HMACMD5 MD5 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。.NET Framework 2.0以降で使用できます。 どのサイズのキーでも受け入れ、長さが 128 ビットのハッシュ シーケンスを生成
HMACRIPEMD160 RIPEMD160 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。.NET Framework 2.0以降で使用できます。 どのサイズのキーでも受け入れ、長さが 160 ビットのハッシュ シーケンスを生成
HMACSHA1 SHA1 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。 どのサイズのキーでも受け入れ、長さが 160 ビットのハッシュ シーケンスを生成
HMACSHA256 SHA256 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。.NET Framework 2.0以降で使用できます。 どのサイズのキーでも受け入れ、長さが 256 ビットのハッシュ シーケンスを生成
HMACSHA384 SHA384 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。.NET Framework 2.0以降で使用できます。 どのサイズのキーでも受け入れ、長さが 384 ビットのハッシュ シーケンスを生成
HMACSHA512 SHA512 ハッシュ関数を使用して、ハッシュ メッセージ認証コード (HMAC) を計算します。.NET Framework 2.0以降で使用できます。 どのサイズのキーでも受け入れ、長さが 512 ビットのハッシュ シーケンスを生成
  • 履歴:
  • 2007/9/6 「HMAC-MD5を計算する」を追加。
  • 2007/9/27 コードを見やすいように書き換えた。
  • 2010/9/26 全体の構成を変更。MD5とSHA1の安全性についての注意を追加。
  • 2010/9/29 「SHA1、SHA256、SHA384、SHA512ハッシュ値を計算する」の表にクラスを追加。
  • 2013/6/27 Clearメソッドを呼び出すようにした。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。