MD5やSHA1などでハッシュ値を計算するここでは、認証やデジタル署名、ファイルが改ざんされていないことの確認などに使用される、MD5(Message Digest 5)やSHA1(Secure Hash Algorithm 1)などのハッシュ値を計算する方法を説明します。
注意:現在では、あるMD5ハッシュ値と同じハッシュ値のデータを作成することが比較的容易にできます。また、SHA1についても脆弱性が指摘されています。電子政府推奨暗号リストにはMD5は入っておらず、SHA1やRIPEMD-160も注釈として「256ビット以上のハッシュ関数を選択することが望ましい」としています。
文字列のMD5ハッシュ値を計算する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) '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); //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クラスを使った方法と同じです。 以下に、このようなクラスを紹介します。
補足: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」を追加する必要があります。 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"にします。 MAC、HMACを計算する.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) '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); //byte型配列を16進数に変換 string result = BitConverter.ToString(bs).ToLower().Replace("-", ""); //結果を表示 Console.WriteLine(result); .NET Framework 2.0からは、以下のようなクラスを使って、HMAC-MD5なども計算できるようになりました。使い方は上の例と同じです。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
|
|
Copyright(C) DOBON!. All rights reserved.
|