エム‐ディー‐ファイブ【MD5】
読み方:えむでぃーふぁいぶ
MD5
読み方:エムディーファイブ
別名:メッセージダイジェストアルゴリズム5
MD5とは、ハッシュ関数と呼ばれる、あるデータから元の値とは異なる数値を得ることができるアルゴリズムの一種で、1991年にマサチューセッツ工科大学のリベスト(Ronald Rivest)教授によって考案されたアルゴリズムのことである。RFC 1321で規定されている。
MD5を利用すると、任意長のデータから128ビットのハッシュ値(メッセージダイジェスト)を出力することができる。32ビットマシンで高速処理ができるように設計されており、また、アルゴリズムをコンパクトにコード化できるという特徴を持っている。MD5は、主にAPOPなどの電子メール認証や、デジタル署名などにおいて利用されている。
MD5は、リベスト教授によるMD4を元に開発されている。なお、米国政府などで主に採用されているSHA(Secure Hash Algorithm)はMD4をベースとしている。
参照リンク
MD5 メッセージダイジェストアルゴリズム - (独立行政法人情報処理推進機構)
md5
md5 — 文字列のmd5ハッシュ値を計算する
説明
string md5 ( string str [, bool raw_output] )» RSA Data Security, Inc. の MD5メッセージダイジェストアルゴリズム を用いて strのMD5ハッシュ値を計算し、そのハッシュを 返します。このハッシュは、32文字の16進数となります。 オプションのraw_outputにTRUEが指定された場 合、md5ダイジェストが16バイト長のバイナリ形式で返されます。
注意: オプションのraw_outputパラメータは、 PHP 5.0.0で追加され、デフォルトはFALSEです。
例 2274. md5() の例
<?php
$str = 'apple';
if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
exit;
}
?>
crc32()、md5_file()、 sha1()も参照ください。
MD5 クラス
アセンブリ: mscorlib (mscorlib.dll 内)
構文
ハッシュ関数は、任意の長さのバイナリ文字列を固定長の小さなバイナリ文字列に割り当てます。暗号ハッシュ関数では、同じ値にハッシュされる 2 つの異なる入力値を検出することが計算上不可能です。つまり、2 組のデータのハッシュは、対応するデータも一致している場合にだけ一致します。データを少し変更しただけでも、ハッシュは予測できないほど大幅に変更されてしまいます。
MD5 アルゴリズムのハッシュ サイズは 128 ビットです。
MD5 クラスの ComputeHash メソッドは、16 バイトの配列としてハッシュを返します。一部の MD5 実装では、32 文字の 16 進形式のハッシュを生成します。このような実装と相互運用するには、ComputeHash メソッドの戻り値を 16 進値として形式指定します。
文字列の MD5 ハッシュ値を計算し、32 文字の 16 進形式の文字列としてハッシュを返すコード例を次に示します。このコード例で作成されるハッシュ文字列は、32 文字の 16 進形式のハッシュ文字列を作成する (任意のプラットフォーム上の) MD5 ハッシュ関数と互換性があります。
Imports System Imports System.Security.Cryptography Imports System.Text Module Example ' Hash an input string and return the hash as ' a 32 character hexadecimal string. Function getMd5Hash(ByVal input As String) As String ' Create a new instance of the MD5 object. Dim md5Hasher As MD5 = MD5.Create() ' Convert the input string to a byte array and compute the hash. Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)) ' Create a new Stringbuilder to collect the bytes ' and create a string. Dim sBuilder As New StringBuilder() ' Loop through each byte of the hashed data ' and format each one as a hexadecimal string. Dim i As Integer For i = 0 To data.Length - 1 sBuilder.Append(data(i).ToString("x2")) Next i ' Return the hexadecimal string. Return sBuilder.ToString() End Function ' Verify a hash against a string. Function verifyMd5Hash(ByVal input As String, ByVal hash As String) As Boolean ' Hash the input. Dim hashOfInput As String = getMd5Hash(input) ' Create a StringComparer an comare the hashes. Dim comparer As StringComparer = StringComparer.OrdinalIgnoreCase If 0 = comparer.Compare(hashOfInput, hash) Then Return True Else Return False End If End Function Sub Main() Dim source As String = "Hello World!" Dim hash As String = getMd5Hash(source) Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".") Console.WriteLine("Verifying the hash...") If verifyMd5Hash(source, hash) Then Console.WriteLine("The hashes are the same.") Else Console.WriteLine("The hashes are not same.") End If End Sub End Module ' This code example produces the following output: ' ' The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c. ' Verifying the hash... ' The hashes are the same.
using System; using System.Security.Cryptography; using System.Text; class Example { // Hash an input string and return the hash as // a 32 character hexadecimal string. static string getMd5Hash(string input) { // Create a new instance of the MD5CryptoServiceProvider object. MD5 md5Hasher = MD5.Create(); // Convert the input string to a byte array and compute the hash. byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); // Create a new Stringbuilder to collect the bytes // and create a string. StringBuilder sBuilder = new StringBuilder(); // Loop through each byte of the hashed data // and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // Return the hexadecimal string. return sBuilder.ToString(); } // Verify a hash against a string. static bool verifyMd5Hash(string input, string hash) { // Hash the input. string hashOfInput = getMd5Hash(input); // Create a StringComparer an comare the hashes. StringComparer comparer = StringComparer.OrdinalIgnoreCase; if (0 == comparer.Compare(hashOfInput, hash)) { return true; } else { return false; } } static void Main() { string source = "Hello World!"; string hash = getMd5Hash(source); Console.WriteLine("The MD5 hash of " + source + " is: " + hash + "."); Console.WriteLine("Verifying the hash..."); if (verifyMd5Hash(source, hash)) { Console.WriteLine("The hashes are the same."); } else { Console.WriteLine("The hashes are not same."); } } } // This code example produces the following output: // // The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c. // Verifying the hash... // The hashes are the same.
System.Security.Cryptography.HashAlgorithm
System.Security.Cryptography.MD5
System.Security.Cryptography.MD5CryptoServiceProvider
プラットフォーム
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
MD5 コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)
構文
解説
プラットフォーム
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
MD5 フィールド
プロテクト フィールド
名前 | 説明 | |
---|---|---|
HashSizeValue | 計算されたハッシュ コードのサイズをビット単位で表します。 ( HashAlgorithm から継承されます。) | |
HashValue | 計算されたハッシュ コードの値を表します。 ( HashAlgorithm から継承されます。) | |
State | ハッシュ計算の状態を表します。 ( HashAlgorithm から継承されます。) |
MD5 プロパティ
パブリック プロパティ
名前 | 説明 | |
---|---|---|
CanReuseTransform | 現在の変換を再利用できるかどうかを示す値を取得します。 ( HashAlgorithm から継承されます。) | |
CanTransformMultipleBlocks | 派生クラスでオーバーライドされると、複数のブロックを変換できるかどうかを示す値を取得します。 ( HashAlgorithm から継承されます。) | |
Hash | 計算されたハッシュ コードの値を取得します。 ( HashAlgorithm から継承されます。) | |
HashSize | 計算されたハッシュ コードのサイズをビット単位で取得します。 ( HashAlgorithm から継承されます。) | |
InputBlockSize | 派生クラスでオーバーライドされると、入力ブロック サイズを取得します。 ( HashAlgorithm から継承されます。) | |
OutputBlockSize | 派生クラスでオーバーライドされると、出力ブロック サイズを取得します。 ( HashAlgorithm から継承されます。) |
MD5 メソッド
パブリック メソッド
名前 | 説明 | |
---|---|---|
Clear | HashAlgorithm クラスによって使用されているすべてのリソースを解放します。 ( HashAlgorithm から継承されます。) | |
ComputeHash | オーバーロードされます。 入力データのハッシュ値を計算します。 ( HashAlgorithm から継承されます。) | |
Create | オーバーロードされます。 この抽象クラスの特定の実装を作成できるようにします。 | |
Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) | |
GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) | |
GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) | |
Initialize | HashAlgorithm クラスの実装を初期化します。 ( HashAlgorithm から継承されます。) | |
ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) | |
ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) | |
TransformBlock | 入力バイト配列の指定した領域のハッシュ値を計算し、結果ハッシュ値を出力バイト配列の指定した領域にコピーします。 ( HashAlgorithm から継承されます。) | |
TransformFinalBlock | 指定したバイト配列の指定した領域のハッシュ値を計算します。 ( HashAlgorithm から継承されます。) |
名前 | 説明 | |
---|---|---|
Dispose | HashAlgorithm によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。 ( HashAlgorithm から継承されます。) | |
Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) | |
HashCore | 派生クラスでオーバーライドされると、ハッシュを計算するために、オブジェクトに書き込まれたデータをハッシュ アルゴリズムにルーティングします。 ( HashAlgorithm から継承されます。) | |
HashFinal | 派生クラスでオーバーライドされると、暗号ストリーム オブジェクトによって最後のデータが処理された後に、ハッシュ計算を終了します。 ( HashAlgorithm から継承されます。) | |
MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |
MD5 メンバ
MD5 ハッシュ アルゴリズムのすべての実装が継承する、抽象クラスを表します。
プロテクト コンストラクタ
プロテクト フィールド
名前 | 説明 | |
---|---|---|
HashSizeValue | 計算されたハッシュ コードのサイズをビット単位で表します。(HashAlgorithm から継承されます。) | |
HashValue | 計算されたハッシュ コードの値を表します。(HashAlgorithm から継承されます。) | |
State | ハッシュ計算の状態を表します。(HashAlgorithm から継承されます。) |
名前 | 説明 | |
---|---|---|
CanReuseTransform | 現在の変換を再利用できるかどうかを示す値を取得します。(HashAlgorithm から継承されます。) | |
CanTransformMultipleBlocks | 派生クラスでオーバーライドされると、複数のブロックを変換できるかどうかを示す値を取得します。(HashAlgorithm から継承されます。) | |
Hash | 計算されたハッシュ コードの値を取得します。(HashAlgorithm から継承されます。) | |
HashSize | 計算されたハッシュ コードのサイズをビット単位で取得します。(HashAlgorithm から継承されます。) | |
InputBlockSize | 派生クラスでオーバーライドされると、入力ブロック サイズを取得します。(HashAlgorithm から継承されます。) | |
OutputBlockSize | 派生クラスでオーバーライドされると、出力ブロック サイズを取得します。(HashAlgorithm から継承されます。) |
名前 | 説明 | |
---|---|---|
Clear | HashAlgorithm クラスによって使用されているすべてのリソースを解放します。 (HashAlgorithm から継承されます。) | |
ComputeHash | オーバーロードされます。 入力データのハッシュ値を計算します。 (HashAlgorithm から継承されます。) | |
Create | オーバーロードされます。 この抽象クラスの特定の実装を作成できるようにします。 | |
Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) | |
GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) | |
GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) | |
Initialize | HashAlgorithm クラスの実装を初期化します。 (HashAlgorithm から継承されます。) | |
ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) | |
ToString | 現在の Object を表す String を返します。 (Object から継承されます。) | |
TransformBlock | 入力バイト配列の指定した領域のハッシュ値を計算し、結果ハッシュ値を出力バイト配列の指定した領域にコピーします。 (HashAlgorithm から継承されます。) | |
TransformFinalBlock | 指定したバイト配列の指定した領域のハッシュ値を計算します。 (HashAlgorithm から継承されます。) |
名前 | 説明 | |
---|---|---|
Dispose | HashAlgorithm によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。 (HashAlgorithm から継承されます。) | |
Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) | |
HashCore | 派生クラスでオーバーライドされると、ハッシュを計算するために、オブジェクトに書き込まれたデータをハッシュ アルゴリズムにルーティングします。 (HashAlgorithm から継承されます。) | |
HashFinal | 派生クラスでオーバーライドされると、暗号ストリーム オブジェクトによって最後のデータが処理された後に、ハッシュ計算を終了します。 (HashAlgorithm から継承されます。) | |
MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |
MD5
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/08/07 08:39 UTC 版)
出典は列挙するだけでなく、脚注などを用いてどの記述の情報源であるかを明記してください。 |
一般 | |
---|---|
設計者 | ロナルド・リベスト |
初版発行日 | 1992年4月 |
シリーズ | MD2, MD4, MD5, MD6 |
詳細 | |
ダイジェスト長 | 128 bit |
構造 | Merkle-Damgård construction |
ラウンド数 | 4 [1] |
最良の暗号解読法 | |
2009年にTao Xie、Dengguo Fengによって強衝突耐性が破られている (220.96 time)。通常のコンピュータで数秒で可能[2]。 |
MD5(エムディーファイブ、英: message digest algorithm 5)は、暗号学的ハッシュ関数のひとつである。ハッシュ値は128ビット。
概要
MD4が前身であり、安全性を向上させたもの。1991年に開発された。開発者はMD4と同じくロナルド・リベスト。
d41d8cd98f00b204e9800998ecf8427e
のようなハッシュ値が得られる。
用途
一般的な暗号学的ハッシュ関数と同様に使用できる。ただし、後述の脆弱性があり強度が必要な場合には使ってはいけない。
実際の使用例
FreeBSDはインストール可能なCDイメージと、それのMD5値を同時に配布している。(MD5値の改変はないと仮定して)インストール可能なCDイメージが、途中で改変されていないことを確認してみる。
- md5 コマンドを、イメージファイルに実行する。
- localhost% md5 5.1-RELEASE-i386-miniinst.iso
- MD5 (5.1-RELEASE-i386-miniinst.iso) = 646da9ae5d90e6b51b06ede01b9fed67
- CHECKSUM.MD5の中身を確認し、一致していれば破損の可能性は極めて低いことが分かる。
- localhost% cat CHECKSUM.MD5
- MD5 (5.1-RELEASE-i386-disc1.iso) = 3b6619cffb5f96e1acfa578badae372f
- MD5 (5.1-RELEASE-i386-disc2.iso) = 2cfa746974210d68e96ee620bf842fb6
- MD5 (5.1-RELEASE-i386-miniinst.iso) = 646da9ae5d90e6b51b06ede01b9fed67
安全性
MD5、およびRIPEMDとよばれるハッシュ関数には理論的な弱点が存在することが明らかとなっている[3][4]。
2004年8月、暗号の国際会議 CRYPTO (のランプセッション)にて、MD5のコリジョンを求めることができたという報告があった。理論的可能性として、MD5を用いて改竄されないことを確認する場合、あらかじめ正規のファイルと不正なファイルを用意しておき、正規のファイルを登録しておきながら、実際には同じMD5を持つ不正なファイルに摩り替える攻撃がありえることを意味する。また2007年11月、2つの全く異なる実行ファイルを元に、各々の末尾にデータブロックを付加し、その部分を変更しながら探索を行うことにより、同一のMD5を持たせることに成功したという報告があった。この攻撃方法は実証されたことになる。
アメリカ合衆国政府では、MD5ではなく、Secure Hash Algorithm (SHA)を標準のハッシュとして使用している。 日本のCRYPTRECでは、MD5を政府推奨暗号リストから外し、SHA-256 (SHA-2のバリエーション) 以上を推奨している。
ハッシュの衝突耐性について
MD5 のハッシュ値については、パソコンレベルでも数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている。すなわち、強衝突耐性は容易に突破されうる状態にある(SHA-0/SHA-1アルゴリズムについても、MD5ほど容易ではないが突破される脆弱性が発見されている)。
一方、任意に与えられたハッシュ値に対して、(何らかの別の)データを生成する実装が広まっているわけではない。すなわち、弱衝突耐性が容易に突破されうる訳ではない。また、任意に与えられたハッシュ値に対して、改竄者の意図どおりのデータ列を容易に生成できる訳でもない(もしそうならば、それは既に暗号ではない)。
強衝突耐性の突破とは例えば、同一のハッシュ値を持つ非ユニークな2つのデータ列D1とD2のペアを1つ発見できた、ということである。なお、この場合D1やD2が意味を持つデータであるかどうかは問われない。また、データ列D3のハッシュ値がHであったとして、この"特定の"ハッシュ値Hに対して、同一のハッシュ値を持つような他のデータ列D4を発見できたとしたら、それは弱衝突耐性を突破された事を意味する(即ち、D3とHの組み合わせで無改竄性を証明できなくなる)。
そのため、直ちにこれらのハッシュアルゴリズムを用いている暗号化通信が盗聴・改竄されたり、電子署名の有効性が無くなると言うわけではない。しかし、強衝突耐性が突破されたという事は、将来的には攻撃手法や計算能力の進化により、弱衝突耐性も突破されうるという事を暗示する。もし弱衝突耐性が突破されたとしたら、もはや暗号化通信や電子署名の無改竄性を証明できなくなり、その暗号化・署名システムは(半ば)死を意味する。
また、暗号化・署名システムのintegrity(例えば最良攻撃手法に対して十分に頑強であるという事)にハッシュ強衝突耐性の突破が困難であるという前提がもし有った場合には、そのシステムのintegrityも当然に失われる事になる。Integrityを要求されるシステムでは、その再検証が最低限必要となる。
APOPの脆弱性
2007年4月IPAはAPOPの脆弱性について警告した[5]。これは電気通信大学の太田和夫(暗号理論)らが発見したもので[6]、APOPのプロトコル上の弱点を利用して、MD5ハッシュから理論的に元のパスワードを求めることが出来るというものである。これの対策としては、SSLの利用が推奨されている。(総当たり攻撃法によるツールは既に公表されている)
Flame攻撃に関して
2012年4月に発覚した「Flame攻撃」(Microsoft Updateに対するなりすまし攻撃)において、一部のデジタル証明書の署名アルゴリズムにMD5が使われていたことから、MD5 の衝突耐性に関する脆弱性をついて、デジタル証明書の偽造が行われたように一部媒体では報道されている[7]。
しかし、米ソフォス (Sophos) 社の記事によると[8]、マイクロソフトがコード署名に使用できるデジタル証明書であって、ターミナルサーバーライセンスインフラストラクチャ(中間Certificate Authenticity)上で使用できるものを、誤って発行していた事が原因とされている。また、Flameマルウェアが攻撃に使用したデジタル証明書を入手した経路、また前述の MD5 で署名された証明書をクラックして偽造したものであるか否かは明らかになっていないとしている。一方マイクロソフトは、Windows Vista以降のバージョンにおけるコード署名の検証を回避するためには攻撃者が MD5 の衝突を利用して特定の拡張フィールドを削除する必要があったとしている[9]。
マイクロソフトは2012年6月5日に、問題となったターミナルサーバーライセンスインフラストラクチャの中間Certificate Authenticityを無効化するセキュリティアップデートを公開している[10]。
アルゴリズム
MD5は可変長の入力を処理して、128ビット固定長の値を出力する。入力メッセージは512ビット(32ビットのワードが16個)ごとに切り分けられるが、長さが512の倍数となるようにパディングが行われる。 パディングとしてはまずメッセージの最後に1ビットの1を足して、その後には長さが512で割って448余る(つまり、512の倍数に64足りない)長さになるようにひたすら0を付け足していく。そして、残った64ビットには元のメッセージの長さ(の下位64ビット)を入れることとなる。
MD5のメイン部分のアルゴリズムは32ビット×4ワード(それぞれのワードをA、B、C、Dと表す) = 128ビットの状態を持って進行していく。初期状態では、この4ワードは決まった定数で初期化されており、 512ビットのブロックを順次使ってこの状態を変化させていくのがMD5の中核となっている。1回の処理では非線形な関数F、232を法とした加算、左へのビットローテートが行われる。 そして、16回の操作を1ラウンドとして、512ビットの入力ブロックを処理するのに4ラウンドの処理が行われる。Fには4通りの関数があり、ラウンドごとに異なるものが使われる。
- カテゴリ:ハッシュ関数・メッセージ認証コード・認証付き暗号
カテゴリ
固有名詞の分類
- MD5のページへのリンク