PHP rasgele sayı nesil Güvenli

2 Cevap php

"Şifremi unuttum" düğmesi: harf kullanın. Bu karma şeklinde depolanır çünkü kullanıcının özgün parolasını bulamıyorum, bunu yapmak için tek şey yeni rasgele bir parola oluşturmak ve ona e-posta olduğunu. Bu yüzden bir yol arıyorum mt_rand yeterince iyi değil, ve genel olarak biz bir barındırma hizmeti kabul edilemez bir şifreleme rasgele sayı modülü vs yüklemek için işletim sistemine erişimi sağlayacak olan için, kriptografik öngörülemeyen rasgele sayılar gerektirir PHP kendisi güvenli rasgele sayı üretmek için.

Ben geldim çözümü kadar, sonra bir ilk tohum, her çağrı için depolama içerir

result = seed
seed = sha512(seed . mt_rand())

Bu sha512 hash fonksiyonunun güvenlik tabanlı (mt_rand çağrı sadece hayat biraz daha zor veritabanının bir kopyasını elde bir düşman için yapmaktır).

Ben bir şey eksik, ya da daha iyi bilinen çözümler vardır muyum?

2 Cevap

Ayrıca OpenSSL openssl_random_pseudo_bytes kullanarak düşünebilirsiniz, PHP 5.3 beri mevcut bulunuyor.

 string openssl_random_pseudo_bytes ( int $length [, bool &$crypto_strong ] )

Generates a string of pseudo-random bytes, with the number of bytes determined by the length parameter. It also indicates if a cryptographically strong algorithm was used to produce the pseudo-random bytes, and does this via the optional crypto_strong parameter. It's rare for this to be FALSE, but some systems may be broken or old.

http://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php

Ben kuvvetle Unix sistemleri veya şifreler için bir entropi kaynağı olarak windows platformu üzerinde kripto-api on / dev / urandom hedefleme öneririz.

Ben sağlamalarının gerçekleştirilmesi önemi büyülü artan entropi cihazlar DEĞİLDİR herhelde. Bu şekilde bunları kötüye kullanmak hiç bu karma olmuştu önce tohum ve rand () verileri kullanılarak daha güvenli ve ben bu iyi bir fikir değil farkındayız eminim. Tohum iptal eder (deterministik mt_rand ()) ve böylece hiçbir nokta bile dahil olmak üzere tüm orada.

İnsanlar akıllı ve zeki olmak ve emeklerinin sonucu kırılgan sistemleri ve gereksiz tehlikeye kendi sistemlerinin güvenliğini ve (kötü tavsiye yoluyla) diğer sistemlerin güvenliğini koymak cihazlardır düşünüyorum.

İki yanlış bir doğru etmez. Bir sistem en zayıf parçası olarak sadece güçlü. Bu onu daha da güvensiz hale kabul etmek için bir lisans veya mazeret değildir.


İşte güvenli rasgele 128-bit dize elde etmek için bazı PHP kodu, gelen this comment at php.net by Mark Seecof:

Güvenlik ve şifreleme amaçlı bazı pseudorandom bit (yumurta, blok şifreleme için rasgele IV, parola karma için rastgele tuz) mt_rand () kötü bir kaynağıdır. Gerekiyorsa "en Unix / Linux ve / veya MS-Windows platformlarında alabilirsiniz Bu gibi işletim veya sistem kütüphaneden pseudorandom bit daha iyi bir notu:

<?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: Her Kullanıcının diğer platform üzerinde sessizce başarısız olsa, / dev / urandom okuma girişimi ve kodunuzda CAPICOM erişmek için girişimi hem de bırakmak genellikle güvenlidir. Kodunuzu daha taşınabilir olacak şekilde orada ikisini de bırakın. "