PHPでは、 Crypt()関数はパスワード暗号化に広く使用されています。さまざまな形式の塩(塩)を使用して、異なる暗号化アルゴリズムに従ってパスワードのセキュリティを強化します。パスワードを安全に保つためには、塩の適切な理解と使用が不可欠です。この記事では、一般的な塩形式を詳細に紹介し、一般的な使用エラーの例を示し、問題を回避するための提案を提供します。
Crypt()関数は、渡されたパスワードと塩に基づいて暗号化された文字列を生成します。塩の目的は、同じパスワードが同じ暗号化の結果を生成するのを防ぎ、虹のテーブル攻撃を避けることです。異なる暗号化アルゴリズムには、異なる形式の塩が必要です。 PHPのCrypt()関数は、DES、MD5、BlowFish、SHA-256、SHA-512などのさまざまなアルゴリズムをサポートしています。
暗号化アルゴリズム | 塩形式の例 | 説明する |
---|---|---|
des | 「xy」などの2文字 | 従来のdes暗号化は、最初の2文字のみを塩として使用し、限られた文字セットを備えています。 |
MD5 | $ 1 $ [8ビット文字] $ 、たとえば$ 1 $ abcdefgh $ | 塩の8ビット文字を備えた1ドルの$ロゴを使用して、より強いMD5暗号化をサポートします。 |
ブローフィッシュ | $ 2A $ [2ビットコスト] $ [22ビット文字] $ 、たとえば$ 2A $ 10 $ abcdefghijk1234567890。 | ブローフィッシュアルゴリズム、2ビットコストパラメーター、22ビットの塩文字、高強度。 |
SHA-256 | $ 5 $ [SALT] $ 、例えば$ 5 $ SALTSTRING $ | SHA-256を使用すると、塩の長さは無制限ですが、約16文字であることをお勧めします。 |
SHA-512 | $ 6 $ [SALT] $ 、例えば$ 6 $ SALTSTRING $ | SHA-512の使用はより安全で、塩の長さは無制限ですが、約16文字であることをお勧めします。 |
<?php
// 使用 MD5 アルゴリズム暗号化パスワード,塩形式に準拠しています MD5 必要とする
$password = "mypassword";
$salt = '$1$abcdefgh$'; // MD5 Salt,8 ビット文字
$hashed = crypt($password, $salt);
echo "MD5 hashed password: " . $hashed . "\n";
// 使用 Blowfish 暗号化,コストはです 10,22 ビットソルトキャラクター
$blowfish_salt = '$2a$10$abcdefghijk1234567890./';
$hashed_bf = crypt($password, $blowfish_salt);
echo "Blowfish hashed password: " . $hashed_bf . "\n";
// 例 URL,ドメイン名を置き換えます m66.net
echo "ウェブサイトにアクセスしてください:https://www.m66.net/login\n";
?>
塩形式のエラー<br> たとえば、 1ドルのプレフィックスなしでMD5暗号化を使用するか、ブローフィッシュの塩が不十分です。その結果、暗号化アルゴリズムまたは暗号化障害の分解が発生し、生成されたハッシュは安全ではありません。
塩が不十分または長すぎる<br> さまざまなアルゴリズムには、塩の長さの要件があります。不十分な長さは、安全性の低下につながります。長すぎると、切り捨てられ、効果的に利用されない可能性があります。
塩には違法な特徴が含まれています
塩は特定の文字セット(通常./0-9A-ZA-Z )のみを含むことができ、違法な文字は暗号化または結果の例外に失敗します。
同じ塩を再利用<br> 同じ塩を使用できますが、これによりハッシュのランダム性とセキュリティが減少します。パスワードごとに一意のランダム塩を生成することをお勧めします。
塩の形式を厳密に接着し、アルゴリズムに従って正しい塩の構造と長さを選択します。
固定塩を避けて、 random_bytes()やopenssl_random_pseudo_bytes()などの安全な乱数で塩を生成します。
正しい塩の生成とアルゴリズムの選択をカプセル化するPHPの組み込みパスワード_HASH()関数を使用し、推奨されます。
暗号化の結果を確認し、暗号化された文字列に予想される塩識別子が含まれていることを確認します。
複雑な塩と暗号化のプロセスを自分で実装しないようにし、エラーの確率を減らします。
Crypt()関数はパスワード暗号化では強力ですが、使用すると塩の形式とコンテンツに関する非常に厳しい要件があります。異なる暗号化アルゴリズムに対応し、一般的なエラーを回避する塩形式を理解することは、パスワードセキュリティを確保するための重要な部分です。新しいプロジェクトの場合、開発プロセスを簡素化してセキュリティを改善するために、より最新のpassword_hash()とpassword_verify()を使用することをお勧めします。