通常のPHPインストールにほとんど含まれていないライブラリに依存せずに、PHPで暗号的に安全な32バイトのソルトを生成するための最良の方法は何ですか?
少しグーグルした後、mt_Rand
が十分に安全であるとは考えられていないことに気づきましたが、代替品の提案は見つかりませんでした。ある記事は/dev/random
から読むことを提案しましたが、これはWindowsでは機能しないだけではありません。それも非常に遅いです。
セキュリティと速度の適切なバランスが必要です(つまり、/dev/random
が通常行うように、512バイトを生成するのに20秒かかることはありません)
注:
mcrypt
はPHP 7.1で非推奨になりました。 上にスキップ) -現在までの回答 。
mcrypt_create_iv()
のドキュメント(およびコメント)を確認することをお勧めします。
これはPHP 7: $salt = random_bytes($numberOfDesiredBytes);
を使用してソルトを生成するだけです。
とにかく、あなたは何のために塩が必要ですか?パスワードの場合は、 password_hash()
および password_verify()
を使用してください。
注:
mcrypt
はPHP 7.1で非推奨になりました。 上にスキップ) -現在までの回答 。
関数mycrypt_create_iv()
を使用できます。これは、PHPバージョン5.3では、UnixだけでなくWindowsサーバーでもランダムソースを使用するためです)。使用する前に、次のことを確認する必要があります。定数MCRYPT_DEV_URANDOM
が定義されています。
mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
ランダムとは異なり、利用可能なエントロピーが十分でない場合、urandomはサーバーをブロックしません。パスワードソルトは一意である必要があるため(必ずしもランダムである必要はありません)、urandomは私にとって良い選択のようです。
uniqueid
もmicrotime
ベースであるため、ランダムな文字列の生成には適していません。 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に減らすと、サイズが大きくなります。これは上記で説明されています。
_/dev/urandom
_から読み取るか、openssl_random_pseudo_bytes()
を使用します。