2009-10-11 24 views
6

Olası Çoğalt:
Secure random number generation in PHPPHP ile kriptografik olarak güvenli rastgele sayıları nasıl üretiyorsunuz?

Biz veritabanında oturum verilerine bağlı olacaktır bir kimlik doğrulama simgesi olarak kullanılacak bir şifreli rasgele dize oluşturmak gerekir. Uygun bir rasgele sayı üreteci yerleşik görünmüyor, PHP kullanıyoruz. Php kullanarak kriptografik olarak güvenli bir N uzunluğundaki diziyi nasıl oluşturabiliriz?

Ayrıca, uygulamanızın doğası gereği shell_exec tablodan çıkar.

+0

Burada cevabı bulun: http://stackoverflow.com/questions/1182584/secure-random-number-generation-in-php –

cevap

-6

uniqid nedir? Dokümanlar, çerezler/oturumlar için nasıl kullanılabileceğine dair bir örneğe sahiptir.

+0

Bu iyi yaklaşım gibi görünüyor - açıklandığı gibi mt_rand birleştirildiğinde Manuel. – Travis

+7

uniqid kriptografik olarak güvenli değildir, özel olarak aynı sayıyı iki kez geri döndürmek için tasarlanmıştır, çünkü sistem saatine dayanır, ancak sadece bir saldırganın üretildiği zaman yaklaşık olarak bilmesi durumunda oldukça düşük bir entropiye sahiptir. – aaaaaaaaaaaa

+0

@ebusiness: OP, şifreleme açısından güvenli bir işlev gerektirmiyor. ve 'uniqid' onun davası için mükemmel. – SilentGhost

-4

Başımın üstünden dışarı çıkın: mikro zamanı alın,% 100 mikro adımla çarpın ve alınan sonucun sha1'inde birkaç rasgele yapın.

+5

Bu çok güvenli olmayacak. Çıktının öngörülebilir olmasını istemiyorsanız, sistem saatini kullanmayın. –

+0

Dan haklı. Güvenliğin önemli olduğu durumlarda, şimdiki zamana dayalı tohumlar yeterli entropi sunmaz. – christophe

4

Platformunuza bağlı olarak/dev/urandom veya CAPICOM kullanabilirsiniz. Bu güzel this comment from Mark Seecof özetlenmektedir:

güvenlik veya kriptografik amaçlarla (yumurta, blok şifreleme için rasgele IV, şifre karma için rastgele tuz) mt_rand() için bazı yalancı rasgele bit gerekiyorsa

" fakir kaynak çoğu Açık durumdadır. Unix/Linux ve/veya MS Windows platformları böyle OS veya sistem kitaplığından yalancı rasgele bit daha iyi bir notu alabilirsiniz:

<?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 
} 
?> 

Not: okumak girişimi hem bırakmak genellikle güvenlidir/dev/urandom ve kodunuzdaki CAPICOM'a erişme girişimi, her biri diğerinin platformunda sessizce başarısız olur. Her ikisini de orada bırakın, böylece kodunuz daha taşınabilir olacaktır. "

+0

Teşekkürler - Bunun en iyi yol olduğuna inanıyorum, çünkü/dev/urandom sadece sistem saatinden çok çeşitli entropi kaynakları kullanıyor. Ancak benim durumumda, bu şekilde fopen kullanamayacağız çünkü temelde kum havuzunda çalışıyoruz. – Travis

+1

GÜNCELLEME: [Windows Platform SDK Yeniden Dağıtılabilir: CAPICOM] 'dan (http://www.microsoft.com/en-us/download/details.aspx?id=25281) - "CAPICOM, Windows SDK'dan başlayarak Windows 7 için Windows SDK ve dağıtılabilir Windows 7 ve Windows Server 2008 R2 işletim sistemlerinin 32-bit sürümlerinde çalışacak olsa da, kullanımı önerilmez .. Daha fazla bilgi için, bkz. [CAPICOM Kullanma Alternatifleri] (http: // msdn.microsoft.com/en-us/library/windows/desktop/cc778518%28v=vs.85%29.aspx)" – Herbert

İlgili konular