MySQLのPASSWORD関数は、phpのコードに変換できます。
function mysql_password($string){
$pass = strtoupper(
sha1(
sha1($string, true)
)
);
$pass = '*' . $pass;
return $pass;
}
41文字のハッシュを返します。
私が実行した場合:
SELECT PASSWORD('securepassword');
どのデバイスでも同じハッシュを返します:
* 214C2FAF32F109AE748170BFABDDFB9B05889E64
確かにそれは私のデータベースが破られた場合、侵入者は簡単に人気のあるパスワードのロードでRainbowテーブルを作成し、ハッシュを一致させることができることを意味します-これは私が心配すべきことではありませんか?
PASSWORD機能がすべてのデバイスに固有であることを期待していましたか?どのようにすれば、すべてのデバイスで一意にすることができますか?
確かに、私のデータベースが破られた場合、侵入者は、人気のあるパスワードのロードを含むRainbowテーブルを簡単に作成し、ハッシュに一致させることができます。
それは正しいです。
ハッシュはユーザーごとに異なりません。これは、攻撃者がハッシュを1回計算し、それをすべてのユーザーのハッシュと照合できることを意味します。塩はこれを不可能にします。
実際、ハッシュはまったく変わらないため、攻撃者はシステムにアクセスする前でも、多くのハッシュを事前計算する可能性があります。
もう1つの問題は、使用されるハッシュ関数(2x SHA1)が非常に高速であり、ブルートフォース攻撃が多くのパスワードを短時間で試行できることです。一般的なハードウェアでは、 ,000,000,000パスワード/秒 を試すことができます。
このパスワードハッシュ方式は、最新のセキュリティ標準を満たしていません。
一意のソルトが使用されないという事実を考えると、同じ文字列に適用された同じハッシュ関数が毎回同じ結果を生成することは正常です(そして非常に必要です!!)。
ハッシュ関数は定義により確定的です
ちなみに、ハッシュされた文字列は常に異なるため、Rainbow Tablesの使用防止はソルトのおかげで行われます(固有のソルトがあるはずです)
=====
編集:実際の質問に完全に答えるため(「すべてのデバイスに固有」の部分):ハッシュがデバイスごとに一意である場合、すべてのハッシュが一致しないため、別のマシンでデータベースを移行することは不可能になります-パスワードに使用されるフィールドの場合、ユーザーはもうログインできなくなります:P他の同様の問題(分散データベースなど)は確かに想像できます。
PASSWORD機能がすべてのデバイスに固有であることを望んでいました
安全なアルゴリズムが十分にないため、従来はアカウントごとに固有のソルトを使用して対処されていましたが、より弱いセキュリティが必要な場合は、デバイス固有のソルトを使用できると思います。
MySQL クライアント証明書をサポートプラグインオーセンティケーター と一緒にすぐに認証できるようになり、いくつかの 標準として利用可能 ( nix PAM )。
(MariaDBにも同じAPIがあります)