始めのメモ:いくつかの記事を読んだ後、SOに関連するセキュリティで保護されたパスワードの保存に関連して、私はまだ私の考え方が今日の現実に当てはまるかどうか確かめてください。
私は現在、Webページ上のユーザーの認証に必要なパスワードを保存および取得するための安全な構造を提供する方法を考えています。ネットをブラウジングし、回答のページを調べていると、ある時点で行き詰まっていました。まず第一に、時間が経過し、すべての記事/回答が最新であるとは限りません。第二に、実際に何をすべきかについて多くのあいまいさが存在します。
PHP5とPostgresデータベースを使用しています。 pg_cryptoモジュールの存在を私に認識している間、データベースレベルでこれらの計算を行うことは、ログに記録してデータベースクエリにプレーンパスワードを渡すため、安全ではないようです。
そこで、アプリケーションコード(PHP)で作業を行うことにしました。 PHP5以降、password_hash()
やpassword_verify()
などの関数を提供するネイティブパスワードハッシュAPIがあります。
私が求めていることは、私が正しい軌道に乗っているかどうか、または強力なセキュリティ関連の引数によってサポートされる可能性のある改善があるかどうかのアドバイスです(ミリオン時間の繰り返しについてのアドバイスはご遠慮ください)。また、これはPHP5を使用して可能ですか、または理論的な知識も欠落していますか(このプロセスに対する私の考え方を考慮すると)。
このプロセスの私の考え方は:
password_hash
bcryptありあなたが見ることができるように私の主な考慮事項はSHA-512またはbcryptoを使用するかどうかですが、私はこのフィールドの容量が不足しているように感じているので、 私の全体のプロセスへの一般的なアドバイスを求めます。
特に、使用する「ハッシュ」プロセスへの私の注意は 比較に関するエリクソンの答えSHA vs Bcrypt によってもたらされました。SHA3の存在は知っていますが、知りませんSHA2ファミリーと比較して改善すべき点があったことを証明しています(これは今のところタイプの問題です)
私がすでに読んだこと:
あなたの質問の多く(SHA-512とbcryptなど)は、AviDがリンクしているガイドで回答されていると思います。しかし、実際にはPHPについて何も言われていないので、その部分についてお答えします。
PHP5でパスワードをハッシュ化
基本的な概念を理解するのは良いことですが、実際にPHP5でパスワードを安全にハッシュすることは非常に簡単です。
$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);
それだけです。それをデータベースに保存し、password_verify
を使用して比較すれば完了です。 password_hash
はユーザーごとのソルトを作成するため、手順2または3は必要ありません[*]。また、ステップ4の最初の部分は必要ありません(一度ハッシュするだけで十分です)。
この結果は、$hashFunctionId$options$saltHash
の形式になります。 hashFunctionIdとオプション(コスト)は、ハッシュの作成方法に関する情報を格納するために使用されます。
[*]混乱を招く理由がわかります。多くのガイドがユーザーごとのソルトの重要性を明示しているため、PHPが実際に機能するのは奇妙に思えるかもしれません。
password_hashオプション
では、ハッシュがそれほど単純な場合、password_hash
の他のオプションの用途は何でしょうか?
PASSWORD_DEFAULT
は、現在bcryptが使用されることを意味しますが、将来、より優れたメソッドがある場合は、それらが使用されます。何らかの理由でこれを制御したい場合は、PASSWORD_BCRYPT
に置き換えてください。
塩の自動生成を置き換える塩を渡すことができます。これは、同じパスワードをハッシュしたときに同じ出力を取得したい場合、またはペッパーを含めたい場合に役立ちます。
10
のデフォルトのコストでは不十分だと思われる場合は、コストを渡すことができます。