現在の位置: ホーム> 最新記事一覧> PHPのCrypt()関数を使用して安全な暗号化のためにBlowfish暗号化アルゴリズム($ 2Y $)を実装する方法は?

PHPのCrypt()関数を使用して安全な暗号化のためにBlowfish暗号化アルゴリズム($ 2Y $)を実装する方法は?

M66 2025-06-23

最新のWebアプリケーション開発では、ユーザーパスワードの安全なストレージが重要です。 PHPの内蔵Crypt()関数は、Blowfish暗号化アルゴリズムを含むさまざまな暗号化アルゴリズムをサポートしています。ブローフィッシュアルゴリズムは、その高強度でカスタマイズ可能な作業要因(コスト)のパスワードハッシュで広く使用されています。この記事では、PHPのCrypt()関数を使用して、BlowFishアルゴリズム(識別子$ 2Y $ )を使用してパスワードを安全に暗号化する方法を詳細に紹介します。

ブローフィッシュ暗号化アルゴリズムとは何ですか?

Blowfishは、古い暗号化アルゴリズムを置き換えるために特異的に設計された対称キー暗号化アルゴリズムです。パスワードハッシュの場合、ブローフィッシュは、調整可能な「作業要因」を備えた優れたブルートプルーフクラッキング機能を提供します。作業要因が高いほど、暗号化の計算に時間がかかり、パスワードセキュリティが向上します。

PHPのCrypt()関数は、$ 2Y $識別子を使用して、PHP 5.3.7以上に推奨される形式であるBlowFish Hash Formatを表します。

PHPのCrypt()関数を使用したブローフィッシュ暗号化

1.塩を生成します

ブローフィッシュアルゴリズムの塩は、 AZ0-9AZを含む22文字の文字列です/合計64文字。 PHPのCrypt()が必要とする塩形式は次のとおりです。

 $2y$ + 2つの作業要因(cost) + $ + 22 ビット塩

例えば:

 $salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);

ここでは、 12が作業因子であり、2^12ハッシュ計算を表します。これは約4096倍であり、安全で遅すぎることはありません。

2。Crypt()関数を使用してパスワードを暗号化します

$password = 'your_password_here';
$hash = crypt($password, $salt);

返された$ハッシュは、データベースに直接保存できる完全なブローフィッシュハッシュストリングです。

3.パスワードを確認します

パスワードを確認するときは、元のハッシュを塩として使用してCrypt()を呼び出し、結果を比較してください。

 function verify_password($password, $hash) {
    return crypt($password, $hash) === $hash;
}

完全なサンプルコード

<?php

// 安全な塩を生成します
function generate_blowfish_salt($cost = 12) {
    if ($cost < 4 || $cost > 31) {
        throw new InvalidArgumentException("作業要因はそうでなければなりません4到着31間");
    }
    $randomBytes = random_bytes(16);
    $base64Salt = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
    return sprintf('$2y$%02d$%s', $cost, $base64Salt);
}

// 暗号化パスワード
function encrypt_password($password, $cost = 12) {
    $salt = generate_blowfish_salt($cost);
    return crypt($password, $salt);
}

// パスワードを確認します
function verify_password($password, $hash) {
    return crypt($password, $hash) === $hash;
}

// テスト
$password = 'mypassword123';
$hash = encrypt_password($password);

echo "パスワードハッシュ: $hash\n";

if (verify_password('mypassword123', $hash)) {
    echo "パスワード検証が成功しました!\n";
} else {
    echo "パスワード検証に失敗しました!\n";
}
?>

関連リンク