ソルトを含むハッシュ化されたパスワードのデータベースストレージを調べると、ソルトの衝突率が高いことに注意してください。つまり、2つのテーブル行に同じソルトが格納されているケースが多すぎます。
改善策の1つは、ソルトハッシュされた新しいパスワードを保存するときに、すぐに「より良い」ソルトの生成を開始することです。
PHP 5.3本番環境で実行します。つまり、PHP 5.4+を必要とするライブラリを使用することはおそらくできません。( CentOS統合には、いくつかのPHP 5.4機能が含まれています。さまざまなライブラリの互換性を調査しています。)
現在、利用できるlibsodiumはありません。
Mcryptとopenssl PHP拡張機能の両方がインストールされ、有効になっています。
ParagonieでのScottのブログ投稿をすべて読みました。最も適切なのは PHPでランダムな文字列と整数を安全に生成する方法 です。
これらの状況でパスワードソルトを作成するための私の最良のオプションは、/ dev/urandomからバイトを取得するためにmcryptを使用することです。
$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)
ソルトには16バイトが適切であると想定しています。 PHPのドキュメントでは、最初のパラメータがバイト単位であるかどうかさえ示されていない!しかし、そうであるように見える。
私たちは数千万のユーザーを持っているので、1億の塩を許可することは妥当なはずです。
私の制約を考えると、mcrypt拡張を介して/ dev/urandomからランダムな16バイトを取得するよりも優れたアプローチを誰かが提案できますか?
確かに、他のアップグレードにも取り組んで、ライブラリの可用性の向上、ハッシュの強化などを行っています。これは、この質問の範囲外です。
それであなたはあなたの塩から何を望みますか?
あなたがする必要がある唯一の仮定は、_/dev/urandom
_が安全であり、少なくとも統計的に乱数を提供することです(そうすべきです)。ほとんどの場合_/dev/urandom
_を使用するため、システム上のほとんどすべての(暗号関連)が壊れてしまうため、これは妥当な仮定です。さらに、mcryptは基本的に_/dev/urandom
_の出力を転送するだけであると想定する必要があります。
プロパティ#1を満たすには、少なくとも128ビット(= 16バイト)のソルトが必要ですが、これは2^(128/2)=2^64
ソルトを観察した後、衝突の可能性が高くなります。すぐにあなたはreallyになるでしょう。私はそれによって、128ビットの衝突耐性を持つ32バイト(= 256ビット)のソルトを使用することを提案しますeverソルトを再利用しても、ソルトはまだかなり小さいです(あなた 512ビットソルトも使用できます...)。
パスワードのハッシュに関する限り、 関連する競争 を確認することをお勧めします。