9

私はphp5.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);
4

3 に答える 3

10

セキュリティ上の理由から、を使用することをお勧めしますopenssl_random_pseudo_bytes。OpenSSLは、適切なランダム性を提供するのに十分なエントロピーの収集を処理します。は決して/dev/urandomブロックしないように考案されており、だまされてそれほどランダムではないバイトを提供する可能性があります。

ランダムバイトを使用すると、SHA1を介してそれらを実行する必要はありません。

すべてを要約すると、次のようにします。

$salt = openssl_random_pseudo_bytes(40, $cstrong);
if (! $cstrong) {
    exit('This should not happen');
}
于 2012-12-30T09:02:51.800 に答える
10

実際には、ほとんど間違いなく違いはありません。

両方とも、暗号的に安全な疑似乱数バイトのソースを提供しますopenssl_random_pseudo_bytesどちらも真に/dev/urandomランダムであることが保証されているわけではありませんが、実際には、既知または予測可能な手法によって、両方が真のランダム性と区別できないことが予想されます。

Kmkaplanは/dev/urandom、次のように、特定の条件下で理論的に予測可能な出力を返す可能性があることに注意して技術的に正しいman unrandomです。

「 /dev/ urandomデバイスからの読み取りは、エントロピーの待機をブロックしません。その結果、エントロピープールに十分なエントロピーがない場合、戻り値は、ドライバーが使用するアルゴリズムに対する暗号攻撃に対して理論的に脆弱です。 。これを行う方法の知識は、現在の未分類の文献では利用できませんが、理論的にはそのような攻撃が存在する可能性があります。これがアプリケーションで懸念される場合は、代わりに/ dev/randomを使用してください。」

ただし、 OpenSSLのドキュメントに記載されているように、実際には同じことが当てはまりますopenssl_random_pseudo_bytes(OpenSSL関数を内部的に呼び出します) 。RAND_pseudo_bytes

"はnum個の疑似ランダムバイトをbufRAND_pseudo_bytes()に入れます。によって生成される疑似ランダムバイトシーケンスは、十分な長さである場合は一意になりますが、必ずしも予測できないわけではありません。暗号化以外の目的や暗号化プロトコルの特定の目的に使用できます。ただし、通常はキー生成などには使用しません。」RAND_pseudo_bytes()

これらの警告はどちらも、実際にこれらの方法の使用を怖がらせるものではありません。これらの警告が説明する弱点は、特定の不自然な状況(起動直後にハードウェアRNGがないディスクレス組み込みデバイスなど)を除いて、理論上のものであり、そうではありません。 PHPが通常展開されている状況での実際的な懸念事項。

結果として、これらの乱数生成方法はどちらも暗号システムで最も弱いリンクにはならないため、どちらかを安全に選択できます。妄想を感じている場合は、両方を使用することもできます。


追伸 利点の1つopenssl_random_pseudo_bytesは、Windowsでも機能することです。一方、/dev/urandomOpenSSL PHP拡張機能がインストールされていない場合でも、Unixで使用できます。したがって、最大限の移植性を得るには、実際に両方のサポートを実装する必要があります。

また、実際に期待した数のバイトを受信したことを常に確認してください。たとえば、/dev/urandom上記の質問のベースコードは、/dev/urandom存在しないWindowsなどのシステムで空の文字列をサイレントに返す可能性があります。

于 2012-12-30T10:23:52.820 に答える
0

私はこれが古い投稿であることを知っていますが、誰かがこれに遭遇した場合、ここに簡単な解決策があります:

compat_random.php
https://gist.github.com/anzz1/29a787fac8ef6d693b41779911287505

<?php
  require_once(dirname(__FILE__) . '/compat_random.php');

  $salt = random_bytes(40);
?>

終わり。

compat_random.phpはわずか2KB、62行のコードです。
どのPHPバージョンでも使用できるはずです。

これらの機能を次の順序でチェックします。

  • random_bytes(PHP> = 7)[暗号論的に安全]
  • openssl_random_pseudo_bytes(OpenSSL)[暗号論的に安全]
  • mcrypt_create_iv(php_mcrypt)[暗号論的に安全]
  • / dev / urandom(UNIXシステム)[暗号的に安全]

これらのいずれかを利用できる可能性が非常に高いですが、利用できない場合は、最終的にフォールバックします。

  • mt_rand()(PHP> = 4)[暗号的に安全ではありませんが、ほとんどの場合は問題ありません]
  • rand()[安全でない]
于 2022-02-03T06:40:04.833 に答える