md5 (uniqid) rastgele benzersiz simgeleri için mantıklı?

5 Cevap php

Ben kullanıcı tarafından tahmin ve (şifre sıfırlar ve onay kodları kullanılmak üzere) hala benzersiz edilemez jetonu üreten bir belirteç jeneratör oluşturmak istiyorum.

Ben genellikle bu kodu görmek; mantıklı mı?

md5(uniqid(rand(), true));

A comment uniqid($prefix, $moreEntopy = true) verim göre

ilk 8 onaltılık karakter = Unixtime, son 5 onaltılık karakter = mikrosaniye.

Ben $prefix-parametre ele nasıl bilmiyorum ..

True $ moreEntopy bayrağı set yoksa Yani, öngörülebilir bir sonuç verir.


QUESTION: But if we use uniqid $moreEntopy, ne bizi satın md5 ile karma geliyor mu? : bu daha iyidir

md5(mt_rand())

edit1: Ben benzersiz bir dizin bir veritabanı sütununda bu belirteci saklamak olacak, bu yüzden sütunları algılar. Faiz / olabilecek

5 Cevap

rand (), bir güvenlik tehlikesi ve bir güvenlik belirteci oluşturmak için asla kullanılmamalıdır: rand() vs mt_rand() (görüntüler gibi "statik" bakın). Ama rastgele sayılar üreten bu yöntemlerden hiçbiri şifreli olarak güvenli olduğunu. Bir uygulama olacak bir CSPRNG platformu, işletim sistemi veya donanım modülü tarafından sağlanan erişmek için gereken güvenli secerts oluşturmak için.

Bir web uygulamasında güvenli sırları için iyi bir kaynak gibi /dev/urandom gibi bir entropi havuzu olmayan erişim engelleme olduğunu. PHP 5.3 itibariyle, PHP uygulamalarında openssl_random_pseudo_bytes() kullanabilir ve Openssl kütüphane işletim sistemine dayalı iyi entropi kaynağını seçeceğiz, Linux altında bu uygulamanın /dev/urandom kullanmak anlamına gelir. Bu code snip from Scott is pretty good,

function crypto_rand_secure($min, $max) {
        $range = $max - $min;
        if ($range < 0) return $min; // not so random...
        $log = log($range, 2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $min + $rnd;
}

function getToken($length=32){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    for($i=0;$i<$length;$i++){
        $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
    }
    return $token;
}

Bu, ben bir kaç ay önce bu bir istendi bulunan başka bir soru bir kopyasıdır. Burada bir soruya bağlantı ve benim cevap: http://stackoverflow.com/a/13733588/1698153.

Ben kabul edilen yanıt ile aynı fikirde değilim. PHPs kendi sitesine göre "[uniqid] does not generate cryptographically secure tokens, in fact without being passed any additional parameters the return value is little different from microtime(). If you need to generate cryptographically secure tokens use openssl_random_pseudo_bytes()."

Ben cevabı bu daha net olabileceğini sanmıyorum, uniqid is not secure.

"Benzersiz" tanımlayın. Eğer iki işaret aynı değere sahip olamaz demek, o kıyım yeterli değildir - bu bir teklik testi ile desteklenmelidir. Benzersiz girişli karma algoritması kaynağı olması eşsiz çıkışları garanti etmez.

Sorunuzu yanıtlamak için, sorunun kendisi tarafından rastgele olarak rastgele ve benzersiz garantili bir jeneratör var edemez, yani md5(mt_rand()) çiftleri yol açabilir. Ne istiyorsun "rastgele görünen" eşsiz değerlerdir. uniqid benzersiz kimliği, rand () tahmin etmek henüz bile zor yapmak için sonuç md5 maskeleri, tahmin etmek bile zor hale rastgele bir sayı ekler verir. Hiçbir tahmin edilemeyen olduğunu. Biz sadece bu kadar zor onlar denemek bile istemem emin olmak gerekir.

MD5 data dependent kimlikleri üretmek için iyi bir algoritma. Ama durumda aynı bitstream (içeriğe) sahip birden fazla öğe var, iki benzer MD5 "kimlikleri" üretim olacak.

Sadece iki kez aynı sayıda oluşturmak için değil garantili bir rand() işlevi uygulayarak Yani, oldukça güvenlidir.

Ama anahtarları güçlü bir dağıtım için, ben şahsen 'vb SHA1 veya Shax kullanmak istiyorum ... ama yine de benzer verilerin sorunu benzer tuşları neden olacaktır.