Posso contare su openssl_random_pseudo_bytes () che è molto casuale in PHP?

6

Mi sono imbattuto in un'applicazione che ha bisogno di generare un token casuale per ciascun utente. È molto importante che ogni token generato sia unico. Il codice dell'applicazione era il seguente:

$token = md5(open_ssl_random_pseudo_bytes(64));

Non so esattamente come funziona open_ssl_random_pseudo_bytes o perché è stato scelto il numero "64", né come questi byte siano associati all'hash MD5.

Quindi quanto è casuale questo gettone? Se il codice viene eseguito 1 miliardo di volte, i token saranno unici?

    
posta Boring person 25.09.2015 - 13:04
fonte

3 risposte

8

open_ssl_random_pseudo_bytes è un generatore di numeri pseudo casuali (CSPRNG) crittograficamente sicuro .

In parole povere, ciò significa che può generare una sequenza imprevedibile e uniformemente distribuita, adatta per la generazione di chiavi. La proprietà imprevedibile è importante, perché anche se è noto lo stato completo del generatore di numeri casuali, un utente malintenzionato non può ricreare sequenze generate in precedenza e non è possibile per un osservatore esterno indovinare lo stato per prevedere le sequenze future.

Questo è in contrasto con un generatore di numeri casuali che prende il seme dal numero di secondi dopo la mezzanotte e genera sequenze prevedibili basate su questo seme. In questo caso, un utente malintenzionato può semplicemente impostare il proprio sistema per generare numeri utilizzando lo stesso seme e può effettivamente indovinare i valori dei token per poterli utilizzare per i propri scopi nefandi.

64 byte ti daranno 512 bit di entropia. Poiché MD5 emette hash di 128 bit, non vi è alcun vantaggio che l'entropia generata sia maggiore di 128. Se il codice viene eseguito un miliardo di volte, esiste una probabilità statisticamente probabile che sia sempre univoco perché si dispone di uno spazio chiave di output di 2 128 (3.4 * 10 38 ). La velocità di collisione di MD5 è di circa 2 64 che è di circa 18 miliardi di miliardi.

    
risposta data 25.09.2015 - 13:28
fonte
7

Dovresti conoscere bug PHP # 70014 che era piuttosto recente e influenza l'affidabilità del% % co_de.

Ho lavorato su paragonie / random_compat , che backports openssl_random_pseudo_bytes() da PHP 7 in PHP 5. Uno dei fallbacks che supporta è random_bytes() , ma se può leggere direttamente da openssl_random_pseudo_bytes() preferirà invece quello.

    
risposta data 07.10.2015 - 09:05
fonte
0

C'è un altro bug con openssl_random_pseudo_bytes ( 71915 ), che può generare valori duplicati quando lo esegui più volte con lo stesso ID di processo. Sembra che sia stato corretto in 5.6.24.

    
risposta data 12.12.2016 - 19:07
fonte

Leggi altre domande sui tag