web-dev-qa-db-ja.com

LinuxでPHP 5.3でパスワードソルトを生成するための正しい方法は、私の制約を前提としていますか?

ソルトを含むハッシュ化されたパスワードのデータベースストレージを調べると、ソルトの衝突率が高いことに注意してください。つまり、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バイトを取得するよりも優れたアプローチを誰かが提案できますか?

確かに、他のアップグレードにも取り組んで、ライブラリの可用性の向上、ハッシュの強化などを行っています。これは、この質問の範囲外です。

3
Edward Barnard

それであなたはあなたの塩から何を望みますか?

  1. 計算前の攻撃を防ぐために、それらはある程度予測不可能である必要があります。
  2. それらはグローバルに一意である必要があります。
  3. 高度にスケーリングする必要があるため、できるだけ小さくする必要があります。

あなたがする必要がある唯一の仮定は、_/dev/urandom_が安全であり、少なくとも統計的に乱数を提供することです(そうすべきです)。ほとんどの場合_/dev/urandom_を使用するため、システム上のほとんどすべての(暗号関連)が壊れてしまうため、これは妥当な仮定です。さらに、mcryptは基本的に_/dev/urandom_の出力を転送するだけであると想定する必要があります。

プロパティ#1を満たすには、少なくとも128ビット(= 16バイト)のソルトが必要ですが、これは2^(128/2)=2^64ソルトを観察した後、衝突の可能性が高くなります。すぐにあなたはreallyになるでしょう。私はそれによって、128ビットの衝突耐性を持つ32バイト(= 256ビット)のソルトを使用することを提案しますeverソルトを再利用しても、ソルトはまだかなり小さいです(あなた 512ビットソルトも使用できます...)。

パスワードのハッシュに関する限り、 関連する競争 を確認することをお勧めします。

2
SEJPM