公開日:2013年2月27日
最終更新日:2020年8月13日
最終更新日:2020年8月13日
安全なパスワードの保存方法(PHP編)
以下の記事の内容を受け、PHP で salt(ソルト)を使用したパスワードと、salt にストレッチングを組み合わせた方法の具体的なコードを示します。
salt にストレッチングを組み合わせる方法ですが、その実装方法としては専用のハッシュ関数を使用することが現在は推奨されます。
PHPでパスワードのハッシュ値を取得するには、password_hash 関数を使用します(>=PHP5.5.0)。
<?php // パスワードのハッシュ値を取得 $hash = password_hash("password", PASSWORD_DEFAULT); echo $hash;
ハッシュ値の出力例は以下のようになります。
$2y$10$WNy1AhuqzrjRfeZfoxBJWeUJFvW5EhWVbmsYmyYBEysP4QnEzNN.i
パスワードをチェックするには password_verify 関数を使用します。
以下のソースで、$password にはユーザーが入力したパスワードを、$hashにはデータベースに格納されているユーザーのハッシュ値を指定します。
<?php $password = "password"; $hash = '$2y$10$WNy1AhuqzrjRfeZfoxBJWeUJFvW5EhWVbmsYmyYBEysP4QnEzNN.i'; // パスワードをチェックする if (password_verify($password, $hash)) { echo "password is valid!"; } else { echo "password is invalid!"; }
推奨されなくなった方法
2019年1月現在、パスワードのハッシュ化は独自実装するのではなく、パスワード用ハッシュ関数を使用することが推奨されています。
そのため、以下のコードのように、自力でソルト、ハッシュ、ストレッチングする方式は、現在では推奨されない方式になります。
<?php define(‘STRETCH_COUNT’, 1000); //文字列から SHA256 のハッシュ値を取得 function get_sha256($target) { return hash(‘sha256′, $target); } //salt+ハッシュ化したパスワードを取得 function get_salted_password($password, $userId) { $salt = get_sha256($userId); return get_sha256($salt . $password); } //salt + ストレッチングしたパスワードを取得 function get_stretched_password($password, $userId) { $salt = get_sha256($userId); $hash = ”; for ($i = 0; $i < STRETCH_COUNT; $i++) { $hash = get_sha256($hash . $salt . $password); } return $hash; }
参考
Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。
スポンサーリンク
カテゴリー:Webアプリケーションセキュリティ対策
このページの内容はもはや古いです。
PHP初学者がここを訪れた際に
これが正しいと誤って覚えてしまうことを防ぐため、
2018年現在での最新の方法が載ったURLの一例を
ここ↓に残しておきます。
https://qiita.com/rana_kualu/items/3ef57485be1103362f56
コメントがおそくなりましたが、最近の方法に記載を修正しました。ご指摘ありがとうございました。