[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
質問
時々、「PHPのパスワードの保存にはbcryptを使え、bcryptのルール"」というアドバイスを聞きます。
しかし
bcrypt
? PHPにはそのような関数はありませんし、Wikipediaにはファイル暗号化ユーティリティのことが書かれていますし、ウェブ検索では
フグ
を、さまざまな言語で表現しています。現在、BlowfishはPHPでも
mcrypt
しかし、それはパスワードの保存にどのように役立つのでしょうか?Blowfishは汎用的な暗号で、2つの方法で機能します。暗号化できるものは、復号化することもできます。パスワードには一方通行のハッシュ関数が必要です。
どのような説明ですか?
どのように解決するのですか?
bcrypt
は、ハードウェアで拡張可能なハッシュアルゴリズムです(設定可能なラウンド数によって)。その遅さと複数のラウンドにより、攻撃者はパスワードを解読するために莫大な資金とハードウェアを投入しなければなりません。さらに、パスワードごとに
塩分
(
bcrypt
塩を必要とします)、そして、おびただしい量の資金やハードウェアがなければ、事実上攻撃は不可能であることを確信することができます。
bcrypt
は
エックスブローフィッシュ
アルゴリズムでパスワードのハッシュ化を行います。の暗号化フェーズでは
Eksblowfish
と
フグ
は全く同じで、鍵のスケジュール段階は
エックスブローフィッシュ
は、その後の状態がソルトとキー(ユーザーパスワード)の両方に依存し、両方の知識がないと事前計算ができないことを保証します。
この重要な違いがあるからです。
bcrypt
は一方向ハッシュアルゴリズムである。
ソルトを知らない限り、平文のパスワードを取得することはできない、ラウンド
およびキー
(パスワード)を入力します。[
ソース
]
bcryptの使用方法。
PHPを使う >= 5.5-DEV
パスワードハッシュ関数
は、PHP 5.5 に直接組み込まれるようになりました。
. これで
password_hash()
を作成し
bcrypt
は、任意のパスワードのハッシュを作成します。
<?php
// Usage 1:
echo password_hash('rasmuslerdorf', PASSWORD_DEFAULT)."\n";
// $2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// For example:
// $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
// Usage 2:
$options = [
'cost' => 11
];
echo password_hash('rasmuslerdorf', PASSWORD_BCRYPT, $options)."\n";
// $2y$11$6DP.V0nO7YI3iSki4qog6OQI5eiO6Jnjsqg7vdnb.JgGIsxniOn4C
ユーザが入力したパスワードを既存のハッシュと照合するために
password_verify()
というように
<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
PHP 5.3.7, 5.5-DEV (RedHat PHP >= 5.3.3 も) を使用する。
があります。 互換性ライブラリ について GitHub 元々C言語で書かれた上記の関数のソースコードを元に作成されたもので、同じ機能を提供します。互換ライブラリをインストールすれば、使い方は上記と同じです(5.3.xブランチのままなら、省略形の配列表記を除いたもの)。
PHP 5.3.7を使用する。 (廃止)
を使用することができます。
crypt()
関数を使用して、入力文字列の bcrypt ハッシュを生成します。このクラスは、入力に対して自動的に塩を生成し、既存のハッシュを検証することができます。
PHP 5.3.7 以降を使用している場合は、組み込み関数あるいは互換ライブラリの使用を強く推奨します。
. この代替案は歴史的な目的のためにのみ提供されています。
class Bcrypt{
private $rounds;
public function __construct($rounds = 12) {
if (CRYPT_BLOWFISH != 1) {
throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
}
$this->rounds = $rounds;
}
public function hash($input){
$hash = crypt($input, $this->getSalt());
if (strlen($hash) > 13)
return $hash;
return false;
}
public function verify($input, $existingHash){
$hash = crypt($input, $existingHash);
return $hash === $existingHash;
}
private function getSalt(){
$salt = sprintf('$2a$%02d$', $this->rounds);
$bytes = $this->getRandomBytes(16);
$salt .= $this->encodeBytes($bytes);
return $salt;
}
private $randomState;
private function getRandomBytes($count){
$bytes = '';
if (function_exists('openssl_random_pseudo_bytes') &&
(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
$bytes = openssl_random_pseudo_bytes($count);
}
if ($bytes === '' && is_readable('/dev/urandom') &&
($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
$bytes = fread($hRand, $count);
fclose($hRand);
}
if (strlen($bytes) < $count) {
$bytes = '';
if ($this->randomState === null) {
$this->randomState = microtime();
if (function_exists('getmypid')) {
$this->randomState .= getmypid();
}
}
for ($i = 0; $i < $count; $i += 16) {
$this->randomState = md5(microtime() . $this->randomState);
if (PHP_VERSION >= '5') {
$bytes .= md5($this->randomState, true);
} else {
$bytes .= pack('H*', md5($this->randomState));
}
}
$bytes = substr($bytes, 0, $count);
}
return $bytes;
}
private function encodeBytes($input){
// The following is code from the PHP Password Hashing Framework
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$output = '';
$i = 0;
do {
$c1 = ord($input[$i++]);
$output .= $itoa64[$c1 >> 2];
$c1 = ($c1 & 0x03) << 4;
if ($i >= 16) {
$output .= $itoa64[$c1];
break;
}
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 4;
$output .= $itoa64[$c1];
$c1 = ($c2 & 0x0f) << 2;
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 6;
$output .= $itoa64[$c1];
$output .= $itoa64[$c2 & 0x3f];
} while (true);
return $output;
}
}
このコードは、こんな風に使うことができます。
$bcrypt = new Bcrypt(15);
$hash = $bcrypt->hash('password');
$isGood = $bcrypt->verify('password', $hash);
あるいは ポータブル PHP ハッシュ化フレームワーク .
関連
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] bcryptはどうして塩を内蔵しているのですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】空の配列要素を削除する
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。