ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでパスワードを処理するいくつかの方法

PHP_PHP チュートリアルでパスワードを処理するいくつかの方法

WBOY
WBOYオリジナル
2016-07-13 09:45:221034ブラウズ

PHP でパスワードを処理するいくつかの方法

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

tru​​ehttp://www.bkjia.com/PHPjc/1041132.html技術記事 PHP がパスワードを処理するためのいくつかの方法。PHP を使用して Web アプリケーションを開発する場合、多くのアプリケーションではユーザーの登録が必要になります。最も一般的なのは、ユーザーの情報を処理する必要があることです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。