ここでは、認証やデジタル署名、ファイルが改ざんされていないことの確認などに使用される、MD5(Message Digest 5)やSHA1(Secure Hash Algorithm 1)などのハッシュ値を計算する方法を説明します。
注意:現在では、あるMD5ハッシュ値と同じハッシュ値のデータを作成することが比較的容易にできます。また、SHA1についても脆弱性が指摘されています。電子政府推奨暗号リストにはMD5は入っておらず、SHA1やRIPEMD-160も注釈として「256ビット以上のハッシュ関数を選択することが望ましい」としています。
MD5CryptoServiceProviderクラスを使用すれば、MD5ハッシュ値を計算することができます。
下の例では、文字列のMD5ハッシュ値を計算し、結果を16進数の数字で出力します。なお文字列をバイト型配列に変換する方法については、「文字列をバイト型配列に変換する」をご覧ください。
'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)
//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」のようになります。
.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)を使用しています。
さらに次のようにFormsAuthentication.HashPasswordForStoringInConfigFileメソッドを使用して、MD5とSHA1のハッシュ値を計算することができます。前述した方法と比較すると、このメソッドは文字列のハッシュ計算しかできません。文字列をUTF8でバイト型配列にエンコードし、それを前述したような方法で計算したハッシュ値と同じ結果になります。
以下にMD5ハッシュ値を計算する例を示します。このコードを実行するには、「参照設定」に「System.Web.dll」を追加する必要があります。
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)
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"にします。
.NET Frameworkには、MAC(Message Authentication Code、メッセージ認証符号)や、HMAC(Keyed-Hashing for Message Authentication Code、ハッシュ ベース メッセージ認証符号)を計算するためのクラスも用意されています。MACTripleDESクラスでTripleDESを使用したMACを、HMACSHA1クラスでSHA1を使用したHMACを計算できます。
以下にHMACSHA1クラスを使ってHMAC-SHA1を計算する例を示します。
'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)
//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 ビットのハッシュ シーケンスを生成 |