【PHP8.x】md5関数の使い方

作成日: 更新日:

md5関数は、指定された文字列のMD5ハッシュ値を計算する関数です。MD5(Message-Digest Algorithm 5)は、任意の長さの入力データから、固定長である128ビット(32文字の16進数表記)のハッシュ値を生成する一方向性のハッシュ関数です。この関数は、主にデータの整合性をチェックするためや、短いユニークな識別子を生成する目的で利用されます。

引数には、ハッシュ化したい文字列を渡します。オプションとして、2番目の引数にtrueを指定すると、結果は32文字の16進数文字列ではなく、16バイトの生バイナリ形式で返されます。これにより、ハッシュ値をよりコンパクトに扱うことができます。

しかし、MD5は現在、セキュリティ上の脆弱性(ハッシュ衝突攻撃に対する耐性の低さ)が指摘されており、特にパスワードの保存やデジタル署名といったセキュリティが非常に重要となる用途には推奨されていません。パスワードのハッシュ化には、PHPが提供するpassword_hash()関数のような、より強力なハッシュアルゴリズムとソルト処理を組み合わせた方法を使用することが強く推奨されます。また、汎用的なハッシュ生成には、hash()関数でSHA-256などのより安全なアルゴリズムを使用することを検討してください。md5関数は、互換性や特定の非セキュリティ要件の場面で利用されます。

基本的な使い方

構文(syntax)

<?php
echo md5("input string");
?>

引数(parameters)

string $string, bool $binary = false

  • string $string: ハッシュ化する対象の文字列
  • bool $binary = false: trueに設定すると、バイナリ形式でハッシュ値を返します。デフォルトはfalseで、16進数形式で返します。

戻り値(return)

string

指定された文字列のMD5ハッシュ値を16進数形式の文字列で返します。

サンプルコード

PHPのmd5関数でハッシュ値を生成し、元の文字列には戻せないことを確認する

<?php

declare(strict_types=1);

/**
 * md5ハッシュの基本的な使用法と、その不可逆性について解説します。
 *
 * 「戻す」というキーワードは、ハッシュ値から元の文字列を復元することを指しますが、
 * MD5はそのような操作ができない「一方向ハッシュ関数」です。
 * このサンプルでは、その仕組みをコードで示します。
 */
function demonstrateMd5(): void
{
    // ハッシュ化したい元の文字列
    $originalString = 'my_secret_password';

    // md5()関数を使い、文字列を32文字の16進数ハッシュに変換します。
    $md5Hash = md5($originalString);

    echo '元の文字列: ' . $originalString . PHP_EOL;
    echo 'MD5ハッシュ: ' . $md5Hash . PHP_EOL;
    echo PHP_EOL;

    // --- MD5ハッシュを元の文字列に「戻す」ことはできるか? ---

    // 結論から言うと、MD5ハッシュから元の文字列を計算で「戻す」ことは原理的に不可能です。
    // MD5は一方向への変換しかできないためです。

    // パスワード認証などで利用する場合、保存しておいたハッシュ値と、
    // ユーザーが入力した文字列をハッシュ化した値を比較することで検証します。

    // ユーザーがログイン時に入力した文字列を想定
    $userInput = 'my_secret_password';

    echo 'ユーザーの入力: ' . $userInput . PHP_EOL;

    // ユーザーの入力をmd5()でハッシュ化し、保存済みのハッシュ値と完全に一致するかを調べる
    if (md5($userInput) === $md5Hash) {
        echo '結果: ハッシュ値が一致しました。認証成功です。' . PHP_EOL;
    } else {
        echo '結果: ハッシュ値が一致しません。認証失敗です。' . PHP_EOL;
    }

    echo PHP_EOL;
    echo '注意: 現在、MD5はセキュリティ強度が低いため、パスワードのハッシュ化には非推奨です。' . PHP_EOL;
    echo '代わりに `password_hash()` と `password_verify()` の使用を強く推奨します。' . PHP_EOL;
}

// 関数を実行して結果を表示します
demonstrateMd5();

PHPの md5() 関数は、指定された文字列から「MD5ハッシュ」と呼ばれる32文字の16進数文字列を生成します。この関数の第1引数にはハッシュ化したい文字列を渡し、戻り値として計算されたハッシュ文字列を受け取ります。

「ハッシュ値から元の文字列に戻す」という操作についてですが、md5() は「一方向ハッシュ関数」という特性を持っているため、生成されたハッシュ値から元の文字列を計算によって復元することは原理的に不可能です。

このサンプルコードでは、まず元の文字列からMD5ハッシュを生成しています。次に、ユーザー認証の仕組みを模倣し、利用者が入力した文字列を都度ハッシュ化して、保存されているハッシュ値と一致するかどうかを比較しています。このように、元の値を直接比較するのではなく、ハッシュ値同士を比べるのが一般的な使い方です。

ただし、現在MD5はセキュリティ上の脆弱性が発見されており、パスワードのような機密情報の保護に用いることは推奨されません。より安全なパスワードハッシュには、PHPに標準で用意されている password_hash() 関数と password_verify() 関数の使用が強く推奨されます。

md5()関数は、文字列を特定の32文字の16進数文字列に変換する一方向のハッシュ関数です。一方向性という特性上、生成されたハッシュ値から元の文字列を計算で復元(戻す)することはできません。パスワード認証などで利用する場合は、ユーザーが入力した文字列を都度ハッシュ化し、保存済みのハッシュ値と一致するかを比較して検証します。しかし、MD5は現在ではセキュリティ強度が非常に低く、パスワードの保管には絶対に使用しないでください。より安全なパスワード管理を実現するために、PHP標準のpassword_hash()関数でハッシュ値を作成し、password_verify()関数で検証する方法を強く推奨します。

PHP MD5ハッシュ生成と脆弱性注意喚起

<?php

/**
 * MD5ハッシュの生成と、セキュリティ上の注意点を示すサンプル関数。
 *
 * MD5は高速なハッシュ関数ですが、暗号学的な脆弱性(衝突攻撃への耐性の低さなど)が指摘されており、
 * パスワードのハッシュ化など、セキュリティが要求される用途での使用は推奨されません。
 *
 * この関数はMD5の動作を理解するためのものであり、本番環境でのセキュリティ用途での使用は避けてください。
 * セキュアなパスワードハッシュには、PHPの `password_hash()` 関数を使用することが強く推奨されます。
 *
 * @param string $inputString ハッシュ化する文字列
 * @return string MD5ハッシュ値
 */
function generateMd5Hash(string $inputString): string
{
    // md5() 関数を使用して文字列をハッシュ化します。
    // 第2引数を省略(またはfalse)すると、32文字の16進数文字列を返します。
    $md5Hash = md5($inputString);

    echo "元の文字列: " . $inputString . PHP_EOL;
    echo "MD5ハッシュ: " . $md5Hash . PHP_EOL;
    echo PHP_EOL;

    // !!! 重要: MD5のセキュリティに関する注意喚起 !!!
    echo "--- セキュリティ上の注意 ---" . PHP_EOL;
    echo "MD5は、かつてデータの整合性チェックなどに広く使われましたが、" . PHP_EOL;
    echo "現在では暗号学的に安全ではないとされています。" . PHP_EOL;
    echo "特に、パスワードのハッシュ化など、セキュリティが求められる用途でMD5を使用することは推奨されません。" . PHP_EOL;
    echo "衝突攻撃(異なる入力から同じハッシュ値が生成されること)への耐性が低く、" . PHP_EOL;
    echo "レインボーテーブル攻撃などによって元の文字列が推測される可能性があります。" . PHP_EOL;
    echo "パスワードのハッシュ化には、PHPの `password_hash()` 関数のような、" . PHP_EOL;
    echo "より強力で安全なハッシュ関数(例: Argon2, bcrypt)を使用してください。" . PHP_EOL;
    echo "--------------------------" . PHP_EOL;

    return $md5Hash;
}

// サンプルコードを実行します。
$mySecret = "MySecretPassword123";
generateMd5Hash($mySecret);

このサンプルコードは、PHPのmd5()関数を使い、与えられた文字列からMD5ハッシュ値を生成する例を示しています。md5()関数は、引数に指定された文字列を元に、32文字の16進数で表現された固定長の文字列を返します。このハッシュ値は、元の文字列が少しでも異なると全く違う値になるという特徴があります。

しかし、現在ではmd5をパスワードのハッシュ化のようなセキュリティが求められる用途で使用することは、深刻な脆弱性があるため強く非推奨とされています。その理由は、異なる入力から同じハッシュ値が生成される「衝突」を容易に引き起こせることや、計算が高速すぎるため「レインボーテーブル攻撃」などによって元の文字列が推測されやすいからです。

このコードはmd5()関数の基本的な動作を学ぶためのものですが、実際の開発でパスワードを安全に保存する際には、より強力で安全なpassword_hash()関数を使用してください。

md5関数は、文字列からハッシュ値を生成しますが、暗号学的な脆弱性が発見されているため、パスワードの保存などセキュリティが重要な用途での使用は絶対に避けてください。異なる文字列から同じハッシュ値が生成される「衝突」の危険や、レインボーテーブル攻撃により元の文字列が推測されやすいためです。現在の主な用途は、ファイルの破損チェックのような、暗号学的な安全性を必要としない場面に限られます。パスワードを安全に扱う場合は、ソルトを自動で付与し、より強力なアルゴリズムを使用するpassword_hash()関数を利用することが必須です。

【PHP8.x】md5関数の使い方 | いっしー@Webエンジニア