PHP を使用して Web アプリケーションを開発する場合、多くのアプリケーションではユーザーの登録が必要になります。登録時に、ユーザーの情報を処理する必要があります。最も一般的なのは電子メールとパスワードです。この記事は、パスワードの処理、つまりパスワードの暗号化について説明することを目的としています。
MD5
多くの PHP 開発者が初めて PHP に触れたとき、パスワードを処理するために好まれる暗号化関数は MD5 ではないかと思います。当時私は次のように考えていました。
$password = md5($_POST["パスワード"]);
上記のコードはよく知られていますか? しかし、MD5 暗号化方式は、その暗号化アルゴリズムが実際には少し単純であり、多くのパスワード クラッキング サイトに大量のパスワード文字列が保存されているため、現在 PHP の世界ではあまり普及していないようです。 MD5 によって暗号化されるため、ここではユーザー パスワードの暗号化に MD5 のみを使用することを強くお勧めしません。
SHA256とSHA512
実は以前のMD5と同時にSHA1暗号化方式も存在しますが、アルゴリズムは比較的単純なのでここでは簡単に触れておきます。ここで説明する SHA256 と SHA512 はどちらも SHA2 ファミリの暗号化関数であり、名前を見れば推測できるかもしれませんが、これら 2 つの暗号化方式はそれぞれ 256 ビット長と 512 ビット長のハッシュ文字列を生成します。
使用方法は次のとおりです:
$password = hash("sha256", $password);
PHP には hash() 関数が組み込まれています。 hash() 関数に暗号化メソッドを渡すだけです。 sha256、sha512、md5、sha1 などの暗号化方式を直接指定できます。
塩分値
暗号化プロセスには、非常に一般的な小さなパートナーであるソルト値もあります。はい、暗号化するときは、一定レベルのセキュリティを達成するために、暗号化された文字列に実際に追加の文字列を追加します。
関数generateHashWithSalt($password) {
$intermediateSalt = md5(uniqid(rand(), true));
$salt = substr($intermediateSalt, 0, 6);
ハッシュを返す("sha256", $password . $salt);
}
Bcrypt
暗号化方式を提案するとしたら、後で説明する Hashing API を強く推奨するため、Bcrypt が最低要件になるかもしれませんが、Bcrypt も比較的優れた暗号化方式です。
関数generateHash($password) {
if (define("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' .substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
Bcrypt は実際には Blowfish 関数と crypt() 関数を組み合わせたものです。ここでは CRYPT_BLOWFISH を使用して Blowfish が利用可能かどうかを判断し、上記のようにソルト値を生成します。ただし、ここで注意しなければならないのは、crypt() のソルト値です。 $2a$ または $2y$ から始まり、詳細については以下のリンクを参照してください:
http://www.php.net/security/crypt_blowfish.php
詳しい情報はこちらからご覧ください:
http://php.net/manual/ja/function.crypt.php
パスワードハッシュAPI
これが私たちのハイライトです。PHP 5.5 以降でのみ利用できる新機能です。これは主に次の機能を提供します。
password_hash() – パスワードを暗号化します。Password_verify() – 暗号化されたパスワードを検証し、ハッシュ文字列が一貫しているかどうかを確認します。
password_needs_rehash() – パスワードを再暗号化します。
password_get_info() – 暗号化アルゴリズムの名前といくつかの関連情報を返します。
crypt() 関数を使用するのに十分ですが、password_hash() はコードを短くするだけでなく、セキュリティ保護も強化します。そのため、PHP 関係者は現在この方法を推奨しています ユーザーのパスワードを暗号化するために、Laravel などの多くの人気のあるフレームワークが使用されています。この暗号化方式を使用してください。
$hash = パスワード_ハッシュ($password, PASSWORD_DEFAULT);
はい、たった 1 行のコードで、すべて完了です。
PASSWORD_DEFAULT は現在 Bcrypt を使用しているため、上記でこれをお勧めします。ただし、Password Hashing API の方が優れた機能を備えているため、厳粛に Password Hashing API を推奨します。ここで注意する必要があるのは、コードで PASSWORD_DEFAULT 暗号化方式を使用する場合、データベース テーブルでパスワード フィールドの長さを 60 文字以上に設定する必要があるということです。この場合、暗号化された文字列 PASSWORD_BCRYPT も使用できます。長さは常に 60 文字になります。
ここでpassword_hash()を使用する場合、ソルト値(salt)と消費値(コスト)を指定する必要はありません。後者はコストが大きいほど暗号化が複雑になると理解できます。アルゴリズムとメモリ消費量が大きくなります。もちろん、対応する塩分値と消費量値を指定する必要がある場合は、次のように記述できます:
$options = [
'salt' =>custom_function_for_salt(), //適切なソルトを生成する独自のコードを作成します
'cost' => 12 // デフォルトのコストは10です
];
$hash =password_hash($password, PASSWORD_DEFAULT, $options);
パスワードが暗号化された後、ユーザーが入力したパスワードが正しいかどうかを判断するためにパスワードを検証する必要があります:
if (password_verify($password, $hash)) {
// パス
}
その他 {
// 無効です
}
とても簡単で、password_verifyを直接使って、前に暗号化した(データベースに保存されている)文字列を検証するだけです。
しかし、時々暗号化方法を変更する必要がある場合、例えば、ある日突然ソルト値を変更したり、消費値を増やしたい場合は、この時点でpassword_needs_rehash()関数を使用します。
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {// コストを12に変更
$hash =password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// 新しいハッシュを保存することを忘れないでください!
}
この方法でのみ、PHP のパスワード ハッシュ API は暗号化方法が再度変更されたことを認識します。これの主な目的は、その後のパスワード検証です。
password_get_info()について簡単に説明すると、この関数は一般に次の3つの情報を確認できます。
algo – アルゴリズムの例
algoName – アルゴリズム名
options – 暗号化時のオプションのパラメータ
それでは、今すぐ PHP 5.5 を使い始めて、それ以前のバージョンについてはもう心配しないでください。
http://www.bkjia.com/PHPjc/1041132.html