web-dev-qa-db-ja.com

PHPでソルトを生成する

通常のPHPインストールにほとんど含まれていないライブラリに依存せずに、PHPで暗号的に安全な32バイトのソルトを生成するための最良の方法は何ですか?

少しグーグルした後、mt_Randが十分に安全であるとは考えられていないことに気づきましたが、代替品の提案は見つかりませんでした。ある記事は/dev/randomから読むことを提案しましたが、これはWindowsでは機能しないだけではありません。それも非常に遅いです。

セキュリティと速度の適切なバランスが必要です(つまり、/dev/randomが通常行うように、512バイトを生成するのに20秒かかることはありません)

15
qster

mcryptはPHP 7.1で非推奨になりました。 上にスキップ) -現在までの回答

mcrypt_create_iv() のドキュメント(およびコメント)を確認することをお勧めします。

7
Amber

これはPHP 7: $salt = random_bytes($numberOfDesiredBytes); を使用してソルトを生成するだけです。

とにかく、あなたは何のために塩が必要ですか?パスワードの場合は、 password_hash() および password_verify() を使用してください。

14

mcryptはPHP 7.1で非推奨になりました。 上にスキップ) -現在までの回答

関数mycrypt_create_iv()を使用できます。これは、PHPバージョン5.3では、UnixだけでなくWindowsサーバーでもランダムソースを使用するためです)。使用する前に、次のことを確認する必要があります。定数MCRYPT_DEV_URANDOMが定義されています。

mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);

ランダムとは異なり、利用可能なエントロピーが十分でない場合、urandomはサーバーをブロックしません。パスワードソルトは一意である必要があるため(必ずしもランダムである必要はありません)、urandomは私にとって良い選択のようです。

7
martinstoeckli

uniqueidmicrotimeベースであるため、ランダムな文字列の生成には適していません。 CPUサイクルは通常、マイクロタイムティックよりもはるかに短いため、ループ内の特定の変数が一定になる可能性があります。 2番目のパラメータ「エントロピー」をtrueに設定すると、

 uniqid('', true)

ランダム性が向上します。

ほとんどの文字セットとの互換性が高いランダムな文字列を取得するには、base64エンコーディングをmcrypt初期化ベクトル関数mcrypt_create_ivに適用します。

$length = 16;
base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM))
//> hlZuRJypdHFQPtI2oSFrgA==
strlen(base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM)))
//> 16

文字アルファベットを2 ^ 6Bitに減らすと、サイズが大きくなります。これは上記で説明されています。

2
Lorenz Lo Sauer

_/dev/urandom_から読み取るか、openssl_random_pseudo_bytes()を使用します。

0
D.W.