質問: md5( salt + password + x ); ``` 私はこれがかなり安全だと確信していますが、心に来るいくつかの質問があります: 1. ユーザー名を塩に入れることは有益でしょうか? 2. 私はすべてのユーザーに共通の塩を使用することを決めましたが、これには何らかの欠点がありますか? 3. もしあれば、推奨される最小塩分は何ですか? 4. md5、shaなどを使用する必要がありますか? 5. 上記のアルゴリズムや提案に何か問題がありますか? 6. ...(気軽にもっと:) 私は決定が必然的に状況に依存していることを知っていますが、私は解決策を探しています: * provide as much security as possible * be fast enough ( < 0.5 second on a decent machine ) だから、理想的なアルゴリズムは、擬似コードでどのように見えるでしょうか?
回答: 現在の "理想的な"パスワードハッシュ関数は、 bcrypt です。これには塩分処理と構成可能な繰り返し回数が含まれています。 無料のオープンソースPHPの実装があります。 2番目に良いのは PBKDF2 です。これは基本的なハッシュ関数に依存していますが、提案する。 技術的な理由があります。 bcryptがPBKDF2よりも「良い」理由 あなたの特定の質問については: > > 1。ユーザー名を塩に入れるのは有益でしょうか? > > > あんまり。 > > 2。私はすべてのユーザーに共通の塩を使用することを決めましたが、これには何らかの欠点がありますか? > > > はい:それは塩を飲むことの利点を取り除きます。存在するsalt単独の理由は、各ハッシュされたパスワードに対して一意であることです。これにより、攻撃者が2つのハッシュされたパスワードを攻撃するのを防ぐことができます。塩は*ユニーク*でなければなりません。ユーザーごとの塩を持っていても、悪いです:ユーザーがパスワードを変更したときに塩を変更する必要があります。 saltが再利用/共有されるときに攻撃者が適用できる最適化の種類には、虹の表を参照してください。 > > 3。もしあれば、推奨される最小塩の長さは何ですか? > > > 塩は一意でなければなりません。一意性は維持するのが難しい性質です。しかし、(十分な乱数生成器、好ましくは暗号的に強い乱数生成器で生成された)*長すぎる*ランダムな塩を使用することによって、十分に高い確率で一意性が得られます。 128ビットの塩は十分に長いです。 > > 4。 md5、shaなどを使用する必要がありますか? > > > MD5は広報には悪い。特定の用途に適用される場合と適用されない場合がある既知の弱点があり、これらの弱点が特定の状況に当てはまらないような信頼性をもって「証明する」ことは非常に困難です。 SHA-1はMD5よりもはるかに深刻ではないにもかかわらず、弱点を持っているので、SHA-1は良いですが「良い」ではありません。 SHA-256は合理的な選択です。上で指摘したように、パスワードハッシュのために、 rel = "nofollow noreferrer"> GPU 、そしてSHA-256のスケールがうまくいきます。そのため、bcryptで使用されるBlowfishの派生が望ましいのです。 > > 5。上記のアルゴリズム/提案に間違いがありますか? > > > 手作りです。それは良くないね。問題は、暗号化アルゴリズムのセキュリティに関する既知のテストがないことです。私たちが望むことができる最高のものは、数百人のプロの暗号技術者が数年間アルゴリズムを壊そうとすることです。もしそうでないなら、アルゴリズムは実際に安全であることが証明されていませんが、明らかであってはならない。 Bcryptは12年にわたって、広く普及し、分析されてきました。 StackOverflowの助けを借りても、あなた自身でそれを打つことはできません。 私は専門の暗号化技術者として、MD5またはSHA-256の単純連結を使用して疑わしい眉を立てます。これらは Merkle-Damgårdハッシュ関数。衝突耐性はありますが、ランダムなオラクル(いわゆる「長さ拡張攻撃」)があります。 。 PBKDF2では、ハッシュ関数は直接使用されるのではなく、 HMAC を介して使用されます。