2012-12-30 9 views
9

私はPHP 5.4でサイトを開発していますが、パスワードセキュリティのためにランダムな塩を使用する方が良いと思いますか?私はurandomまたはopenssl_random_pseudo_bytesを使用する必要がありますか?

$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

'sha1()'を使うと、ランダムな塩の有効性が大幅に低下します。なぜなら、それは40文字で、0-9とa-f文字しか含まない文字列に変換するからです。 –

+0

私は両方の提案を行っています – John

答えて

10

あなたがopenssl_random_pseudo_bytesを使用したほうが良いです。 OpenSSLは、あなたに優れたランダム性を提供するのに十分なエントロピーを収集します。 /dev/urandomに決してブロックと考案されています。

ランダムバイトでは、SHA1で実行する必要はありません。それをすべてを合計する

は、実行します。実際には

$salt = openssl_random_pseudo_bytes(40, $cstrong); 
if (! $cstrong) { 
    exit('This should not happen'); 
} 
+1

実際には、 'openssl_rand_pseudo_bytes'は本当のランダム性も保証していません(これ以上の組み合わせはありません) '/ dev/urandom'よりも、それは名前の中の '擬似'が意味するものです。しかしながら、実際には、両方とも、既知の手段によってランダムから区別できない出力を生成する。 –

+0

@IlmariKaronenもちろん、あなたは本当のランダム性を得ることはありません。私は "良い"と書いた。 OpenSSLが「暗号的に強力」と呼ぶものそのため、結果が暗号的に強力であることを確認するためのテストを行いました。 – kmkaplan

+1

[OpenSSLを使用しない](https://github.com/ramsey/uuid/issues/80) –

9

は、ほぼ確実に違いはありません。

openssl_random_pseudo_bytes/dev/urandomの両方は、擬似ランダムバイトの暗号で安全なソースを提供します。いずれも、本当にランダムであることが保証されていませんが、実際には、どちらも既知のまたは予見可能な技術によって真のランダム性と区別できないことが予想されます。

Kmkaplanがman unrandomに述べたよう/dev/urandomは、特定の条件下で、理論的に予測可能な出力を返すことができることを指摘で技術的に正しい:

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

OpenSSL documentationで述べたようしかし、同じことが、(内部のOpenSSL関数RAND_pseudo_bytescallsする)openssl_random_pseudo_bytesの実際に真である:

"RAND_pseudo_bytes()BUFにNUM擬似ランダムバイトを置きますRAND_pseudo_bytes()によって生成された疑似ランダムバイトシーケンスは、十分な長さであれば一意ですが、必ずしも予測できないものではありません。非暗号化目的や特定の目的で泣き言ptographicプロトコルですが、通常は鍵の生成などには使用されません。「

は、これらの警告はいずれも、彼らはおそらく、このようなboot-直後の無いハードウェアRNGとディスクレス組み込みデバイス上などの特定の不自然な状況(下を除いて、理論だけでは説明の弱点をこれらのメソッド—を使用してからあなたを怖がらせる、実際にすべきです

これらの乱数生成方法はどちらも暗号化システムでthe weakest linkになることはないので、いずれかを安全に選択することができます。妄想を感じている場合は、両方を使用することもできます。


Ps。 openssl_random_pseudo_bytesの利点の1つは、Windowsでも動作することです。一方、/dev/urandomは、OpenSSL PHPエクステンションがインストールされていなくてもUnix上で利用できます。したがって、移植性を最大限に高めるには、実際に両方のサポートを実装する必要があります。

また、実際に期待どおりのバイト数を受け取ったことを必ず確認してください。例えば、上記の質問の/dev/urandomベースのコードは、Windowsのようなシステムで空文字列を返すことがあります。/dev/urandomが存在しません。

+0

'RAND_pseudo_bytes'と' openssl_random_pseudo_bytes'は、 "生成されたバイトが暗号的に強いかどうか"を示すコードを返します。 – kmkaplan

関連する問題