web-dev-qa-db-ja.com

urandom()またはopenssl_random_pseudo_bytes()を使用する必要がありますか?

PHP 5.4でサイトを開発しています。5.4。パスワードのセキュリティのためにランダムなソルトを生成するために使用するのに適した関数はどれですか?

$salt = sha1(openssl_random_pseudo_bytes(23));

または

$seed = '';
$a = @fopen('/dev/urandom','rb');
$seed .= @fread($a,23);
$salt = sha1(seed);

それとも私は一緒に行くべきですか:

$salt =  openssl_random_pseudo_bytes(40);

または

$salt = '';
$a = @fopen('/dev/urandom','rb');
$salt .= @fread($a,23);
6
John

パスワードハッシュ用のソルトを生成する正しい方法は、自分で行わないことです。すでに適切に機能しているライブラリを使用してください。ポインタについては、@ Terryの回答を参照してください。

あなたの正確な質問では、openssl_random_pseudo_bytes()がOpenSSLの内部 [〜#〜] prng [〜#〜] に依存していることが偶然に起こります。基盤となるプラットフォームが提供する、つまり_dev/urandom_なので、安全です。厳密に言うと、その関数の2番目のパラメーターを使用して、OpenSSLdidがローカルプラットフォームで強力なランダム性のソースを見つけるかどうかを確認する必要があります( documentation )ですが、実際には、OpenSSLがUnixライクまたはWindowsライクなプラットフォームで実行される限り、問題はありません。したがって、セキュリティのために、openssl_random_pseudo_bytes()を呼び出すか、または_/dev/urandom_を自分で読み取るかは、実際には重要ではありません。メンテナンス上の理由から、前者の方がより簡単で(1回の呼び出しのみ)、より移植性があります(Windowsでも機能しますが、_/dev/urandom_の読み取りは機能しません)。

どちらの方法でも、openssl_random_pseudo_bytes()または_/dev/urandom_の出力にSHA-1を適用してもまったく役に立ちません。良いPRNGは、予測不可能な均一にランダムなバイトをすでに生成しています(そして、PRNGが良くない場合、なぜそれを使用しているのですか?)。

7
Thomas Pornin

注:これは質問に正確に答えるものではありません。

自分の暗号をロールバックしないようにしてください。 PHPを使用しているので、ソルトの生成を含むパスワードハッシュの側面を処理する優れたbcryptライブラリ- phpass がすぐに利用できます。

3
user10211