2009-10-11 15 views
6

可能性の重複:
Secure random number generation in PHPPHPで暗号で安全な乱数を生成するにはどうすればよいですか?

私たちは、データベースにセッションデータに関連付けされる認証トークンとして使用するために、暗号のランダムな文字列を生成する必要があります。 PHPを使用していますが、適切な乱数ジェネレータが組み込まれていないようです。私はどのように私はphpを使用してNの長さの暗号安全にランダムな文字列を生成できますか?

また、アプリケーションの性質上、shell_execはテーブルから外れています。

+0

ここにあなたの答えを探す:http://stackoverflow.com/questions/1182584/secure-random-number-generation-in-phpは –

答えて

-6

uniqid? docsには、Cookie /セッションにどのように使用できるかの例があります。

+0

これが最善のアプローチであると思われる - で説明したようにmt_randと組み合わせたときマニュアル。 – Travis

+7

uniqidは暗号では安全ではなく、システムクロックに基づいているため、同じ番号を2回返さないように特に設計されています。 – aaaaaaaaaaaa

+0

@ebusiness:OPは実際には暗号的に安全な機能を必要としません。 'uniqid'は彼の場合には完璧です。 – SilentGhost

-4

私の頭の上から外れています:微小時間をかけ、微小時間%100でそれを掛け、受け取った結果のsha1にはいくつかの無作為をします。

+5

それはあまり安全ではありません。出力を予測可能にしない場合は、システムクロックを使用しないでください。 –

+0

ダンが正しいです。セキュリティが重要な場合、現在の時間に基づくシードは十分なエントロピーを提供しません。 – christophe

4

プラットフォームによっては、/ dev/urandomまたはCAPICOMを使用することができます。これがうまくthis comment from Mark Seecofに要約される。

「あなたは、セキュリティや暗号化の目的のためにいくつかの擬似ランダムビット(卵、ブロック暗号のためのランダムIV、パスワードハッシュのためのランダムな塩)を必要とするmt_rand()が悪い源である場合、最も上。 UNIX/Linuxと/またはMS-Windowsのプラットフォームでは、あなたは、このように、OSまたはシステムライブラリからの疑似ランダムビットのより良い成績を得ることができます。

<?php 
// get 128 pseudorandom bits in a string of 16 bytes 

$pr_bits = ''; 

// Unix/Linux platform? 
$fp = @fopen('/dev/urandom','rb'); 
if ($fp !== FALSE) { 
    $pr_bits .= @fread($fp,16); 
    @fclose($fp); 
} 

// MS-Windows platform? 
if (@class_exists('COM')) { 
    // http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx 
    try { 
     $CAPI_Util = new COM('CAPICOM.Utilities.1'); 
     $pr_bits .= $CAPI_Util->GetRandom(16,0); 

     // if we ask for binary data PHP munges it, so we 
     // request base64 return value. We squeeze out the 
     // redundancy and useless ==CRLF by hashing... 
     if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); } 
    } catch (Exception $ex) { 
     // echo 'Exception: ' . $ex->getMessage(); 
    } 
} 

if (strlen($pr_bits) < 16) { 
    // do something to warn system owner that 
    // pseudorandom generator is missing 
} 
?> 

NB:読んしようとする試みの両方を残すことが一般的に安全です/ dev/urandomとあなたのコードでCAPICOMにアクセスしようとすると、それぞれがもう一方のプラットフォームで静かに失敗するでしょう。

+0

ありがとう - 私はこれが最良の方法だと信じています。なぜなら、/ dev/urandomはシステムクロックだけでなく、さまざまなエントロピーソースを使用しているからです。しかし私の場合、基本的にはサンドボックス環境で作業しているので、この方法でfopenを使用することはできません。 – Travis

+1

更新:[Windows Platform SDK Redistributable:CAPICOM](http://www.microsoft.com/en-us/download/details.aspx?id=25281) - 「CAPICOMは、Windows SDKからWindows 7用Windows SDK、および配布可能プログラムは32ビット版のWindows 7およびWindows Server 2008 R2オペレーティングシステムで実行されますが、その使用は推奨されません。詳細については、[CAPICOMの使用方法](http:// msdn.microsoft.com/en-us/library/windows/desktop/cc778518%28v=vs.85%29.aspx) " – Herbert

関連する問題