CoderTools

MD5ジェネレーター

テキストのMD5ハッシュ値を生成し、データ整合性の検証に役立つ

MD5について

MD5(メッセージダイジェストアルゴリズム5)は、一般的に32桁の16進数として表現される128ビット(16バイト)のハッシュ値を生成する広く使用されている暗号化ハッシュ関数です。1991年にロナルド・リベストによって設計され、1992年4月にRFC 1321として規格化されました。

セキュリティの脆弱性にもかかわらず、MD5はデータの整合性を検証し、意図しないデータ破損を検出するためのチェックサムなど、セキュリティに関係のないアプリケーションでは依然として一般的に使用されています。より新しいセキュアハッシュアルゴリズムに比べて計算要件が低いため、非暗号化用途には適しています。

<strong>セキュリティに関する注意:</strong> MD5は衝突攻撃に対して脆弱であるため、パスワード保存、SSL証書、デジタル署名などのセキュリティに重要なアプリケーションには適していません。CMUソフトウェアエンジニアリング研究所は2008年からMD5を"暗号学的に破られており、さらなる使用には不適切"と見なしています。

歴史とアルゴリズム

MD5はマサチューセッツ工科大学のロナルド・リベスト教授によって、MD4のより安全な代替品として設計されました。このアルゴリズムは任意の長さの入力メッセージを受け取り、128ビットの"指紋"または"メッセージダイジェスト"を出力します。MD5アルゴリズムは32ビットマシンで非常に高速に動作するよう設計され、大きな置換テーブルを必要としないため、コンパクトな実装が可能です。

このアルゴリズムは入力を512ビットのブロックに分割し、可変長メッセージを128ビットの固定長出力に処理します。4つの32ビット単語(A、B、C、D)に分割された128ビットの状態で動作し、非線形関数、モジュラー加算、ビット回転に基づく16の操作を各ラウンドで実行する4つのラウンドの操作を経ます。

アルゴリズム擬似コード

// 変数の初期化
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

// 関数の準備
F(X,Y,Z) = (X AND Y) OR ((NOT X) AND Z)
G(X,Y,Z) = (X AND Z) OR (Y AND (NOT Z))
H(X,Y,Z) = X XOR Y XOR Z
I(X,Y,Z) = Y XOR (X OR (NOT Z))

// メッセージの処理(メッセージは512ビットの倍数でなければならない)
// メッセージの長さが 448 ≡ (mod 512) になるまでパディングする
// 元のメッセージ長の64ビット表現を付加する

// メインループ
パディングされたメッセージの各512ビットチャンクに対して:
    // チャンクを16個の32ビット語に分割する (M[0..15])
    // チャンクの状態をコピーする
    AA = A
    BB = B
    CC = C
    DD = D
    
    // 第1ラウンド
    i = 0から15まで:
        A = B + ((A + F(B,C,D) + M[i] + T[i]) <<< s[i])
        A, B, C, Dを循環シフト
    
    // 第2ラウンド
    i = 16から31まで:
        A = B + ((A + G(B,C,D) + M[(5*i + 1) mod 16] + T[i]) <<< s[i])
        A, B, C, Dを循環シフト
    
    // 第3ラウンド
    i = 32から47まで:
        A = B + ((A + H(B,C,D) + M[(3*i + 5) mod 16] + T[i]) <<< s[i])
        A, B, C, Dを循環シフト
    
    // 第4ラウンド
    i = 48から63まで:
        A = B + ((A + I(B,C,D) + M[(7*i) mod 16] + T[i]) <<< s[i])
        A, B, C, Dを循環シフト
    
    // チャンク処理結果の追加
    A = A + AA
    B = B + BB
    C = C + CC
    D = D + DD

// 出力
MD5 = A || B || C || D // 128ビットの結果に連結

セキュリティの脆弱性

1996年、MD5の設計に欠陥が発見されましたが、当時は致命的とは考えられていませんでした。2004年までに、より深刻な脆弱性が発見され、研究者は実用的な衝突攻撃——同じMD5ハッシュ値を生成する異なる入力のペアを作成する方法——を実証しました。

2008年、研究者のグループはこれらの脆弱性を利用して、正当に見える偽造SSLサーティフィケートを作成しました。2012年には、Flameマルウェアがマイクロソフトのデジタル署名を偽造するためにMD5の弱点を悪用しました。現代の衝突攻撃は、標準的なコンピュータハードウェアで数秒以内にMD5衝突を見つけることができます。

一般的な使用例

Input: "Hello, World!"

MD5 Hash: 65a8e27d8879283831b664bd8b7f0ad4

Input: "" (empty string)

MD5 Hash: d41d8cd98f00b204e9800998ecf8427e

参考資料と関連読み物

関連ツール