web-dev-qa-db-ja.com

PHP)のpassword_hash()と、DBの外部にそのソルト(の一部)を保存することについて

PHP 5.5はcrypt()によく似たpassword-hash()であることがわかりました。これはmd5()またはsha1()よりも安全です(遅い)。結果文字列はalgo + hash + saltであり、そのままpassword-verify()に渡してパスワードを検証できます。

残っているいくつかの終末の質問:

Q1)結果のフォーマット/プロトコル/規約の名前は何ですか?

Q2)ただし、取得できないのは、すべてのソルトがデータベースに含まれていることです。 badguy®がこれらを取得する場所である場合、彼はallパズルパーツを持っています。以前、私はソルトをデータベースの外(一部)に置くことを学びました:ソースに、ram/system/hardwareの値に基づいて、ディスク上にさえないようにします。なぜこれが促進されないのですか、またはどうすればよいですか?もちろん、私は別のソルトでダブルハッシュを実行することができますか、それとももっと良い方法がありますか?

Q3)また、セキュリティが必要とする終末期の考え方では、単一点障害のpassword_hash()が高い価値のターゲットになると考えており、自己完結型のcrypt()よりも簡単にMITM攻撃を促進する可能性があります。 「悪い」アルゴを書いてPASSWORD_DEFAULTアルゴとして設定することは、crypt()を変更するよりも簡単だと思います。私はPHPバックエンドコード/モジュールを調べていませんが、推測するだけです。

考慮事項を歓迎します。 承認された回答は、最大で1週間以内に2/3の質問に対して最も多くの賛成票/国勢調査を取得し、質問1が検証可能で正しいものになります。

1
Barry Staes

結果のフォーマット/プロトコル/規約の名前は何ですか?

password_hash()bcryptアルゴリズムを使用します。

PASSWORD_DEFAULT-bcryptアルゴリズムを使用します(PHP 5.5.0以降のデフォルト)。この定数は、PHPに新しい強力なアルゴリズムが追加されると、時間とともに変化するように設計されています。そのため、この識別子を使用した結果の長さは時間とともに変化する可能性があるため、60文字を超えて拡張できるデータベース列に結果を格納することをお勧めします(255文字が適切な選択です)。

ソース: http://www.php.net/manual/en/function.password-hash.php

Q2)ただし、取得できないのは、すべてのソルトがデータベースに含まれていることです。 badguy®がこれらを入手する場所であれば、彼はすべてのパズルのパーツを持っています。以前、私はソルトをデータベースの外(一部)に置くことを学びました:ソースに、ram/system/hardwareの値に基づいて、ディスク上にさえないようにします。なぜこれが促進されないのですか、またはどうすればよいですか?もちろん、私は別のソルトでダブルハッシュを実行することができますか、それとももっと良い方法がありますか?

ソルトの唯一の要件は、グローバルに一意であることです。秘密にする必要はありません。 password_hash()が処理します。派手で愚かなことはしないでください。参照: 塩の保存方法

Q3)また、セキュリティが必要とする終末期の考え方では、単一点障害のpassword_hash()が高い価値のターゲットになると考えており、自己完結型のcrypt()よりも簡単にMITM攻撃を促進する可能性があります。 「悪い」アルゴを書いてPASSWORD_DEFAULTアルゴとして設定することは、crypt()を変更するよりも簡単だと思います。私はPHPバックエンドコード/モジュールを調べていませんが、推測するだけです。

何? MITMは文字通り[〜#〜]何もしません[〜#〜]これには関係ありません。ハッシュはサーバー上で行う必要があります。攻撃者がサーバー上のファイルを変更できる場合、攻撃者はすでに自分のやりたいことは何でもできます。

6
user10211