2009-08-18 20 views
17

PHP ha una funzione uniqid() che genera un UUID di sorta.Perché MD5'ing a UUID non è una buona idea?

Negli esempi di utilizzo, si evidenzia quanto segue:

$token = md5(uniqid());

Ma nei commenti, someone says this:

generazione di un MD5 da un ID univoco è ingenuo e riduce gran parte del il valore di ID univoci, oltre a fornire significativa stenosi (attaccabile) sul dominio MD5. Questa è una cosa profondamente disturbata da fare . L'approccio corretto consiste nell'utilizzare l'ID univoco su proprio; è già predisposto per la non collisione .

Perché è vero, se è così? Se un hash MD5 è (quasi) unico per un ID univoco, cosa c'è di sbagliato nell'md5 di un uniqid?

risposta

33

Un UUID è largo 128 bit ed è unicità inerente al modo in cui viene generato. Un hash MD5 ha una larghezza di 128 bit e non garantisce univocità, ma solo una bassa probabilità di collisione. L'hash MD5 non è più piccolo dell'UUID, quindi non aiuta con l'archiviazione.

Se si conosce l'hash è da un UUID è molto più facile da attaccare perché il dominio di UUID validi è in realtà abbastanza prevedibile se si sa nulla circa la macchina li geneerating.

Se fosse necessario fornire un token sicuro, sarebbe necessario utilizzare un UIID cryptographically secure random number generator. (1) non progettato per essere protetto crittograficamente, solo garantito. Una sequenza monotonicamente crescente limitata da identificatori di macchine univoci (tipicamente un MAC) e il tempo è ancora un UUID perfettamente valido ma altamente prevedibile se è possibile decodificare un singolo UUID dalla sequenza di token.

  1. La caratteristica che definisce un crittograficamente sicuro PRNG è che il risultato di una data iterazione non contiene informazioni sufficienti per dedurre il valore della prossima iterazione - vale a dire c'è qualche stato nascosto nel generatore che non viene rivelato in il numero e non può essere dedotto esaminando una sequenza di numeri dal PRNG.

    Se si entra nella teoria dei numeri, è possibile trovare i modi per indovinare lo stato interno di alcuni PRNG da una sequenza di valori generati. Mersenne Twister è un esempio di un tale generatore. Ha uno stato nascosto che ha usato per ottenere il suo lungo periodo ma non è crittograficamente sicuro - puoi prendere una sequenza piuttosto piccola di numeri e usarlo per dedurre lo stato interno. Dopo averlo fatto, puoi usarlo per attaccare un meccanismo crittografico che dipende dal mantenere segreta quella sequenza.
4

MD5ing un UUID è inutile perché gli UUID sono già unici e di lunghezza fissa (breve), proprietà che sono alcune delle ragioni per cui le persone utilizzano spesso MD5 per iniziare. Quindi suppongo che dipenda da cosa pensi di fare con l'UUID, ma in generale un UUID ha le stesse proprietà di alcuni dati che sono stati MD5, quindi perché entrambi?

+1

In effetti, è peggio, perché gli UUID sono unici, mentre gli hash MD5 degli UUID non lo sono. –

2

UUID sono già unici, quindi non c'è nessun punto nel MD5'ing loro comunque.

Per quanto riguarda la domanda di sicurezza, in generale, si può essere attaccato se l'attaccante può prevedere ciò che il prossimo ID univoco sarà che si sta per creare.Se è noto che generi gli ID univoci dagli UUID, l'insieme di potenziali ID univoci successivi è molto più piccolo, dando una migliore possibilità di un attacco di forza bruta.

Ciò è particolarmente vero se l'utente malintenzionato può ottenere un sacco di ID univoci da te, e in questo modo indovina il tuo schema di generazione di UUID.

+0

"non c'è punto": infatti, è peggio di nessun punto, perché gli UUID sono unici, mentre gli hash MD5 degli UUID non lo sono. –

2

Version 3 di UUID sono già MD5, quindi non ha senso farlo di nuovo. Tuttavia, non sono sicuro di cosa usi la versione UUID di PHP.

12

Nota che uniqid() non restituisce un UUID, ma una stringa "unico" sulla base del tempo corrente:

$ php -r 'echo uniqid("prefix_", true);' 
prefix_4a8aaada61b0f0.86531181 

Se lo fai più volte, si otterrà stringhe di output molto simili e tutti chi ha familiarità con uniqid() riconoscerà l'algoritmo di origine. In questo modo è abbastanza facile prevedere i prossimi ID che verranno generati.

Il vantaggio di md5() - zione dell'uscita, insieme con una stringa sale specifico dell'applicazione o numero casuale, è un modo difficile da indovinare stringa:

$ php -r 'echo md5(uniqid("prefix_", true));' 
3dbb5221b203888fc0f41f5ef960f51b 

differenza pianura uniqid(), questo produce molto diverso emette ogni microsecondo. Inoltre, non rivela la stringa "prefix salt", né l'utilizzo di uniqid() sotto il cofano. Senza conoscere il sale, è molto difficile (considera impossibile) indovinare il prossimo ID.

In sintesi, non sarei d'accordo con l'opinione del commentatore e preferirei sempre l'uscita md5() -ed su semplice uniqid().

+3

Se hai bisogno che i tuoi ID non siano guidabili, prendere un input facilmente intuibile e offuscarlo non è la strada da percorrere. –

+0

Qual è l'input ipotizzabile se non si espone la stringa salt (prefisso utilizzato per uniqid())? Puoi spiegare le tue critiche? –

+1

Esistono modi perfettamente validi per generare ID davvero inosservati. Semplicemente offuscando una sequenza facilmente predetta, non ti affidi a nessuno per capire il metodo e la tua stringa salina. Se lo fanno, possono facilmente prevedere gli ID che genererai in futuro. –

0

Per inciso, MD5 è in realtà obsoleto e non deve essere utilizzato per scopi di protezione - PHI, PII o PCI - dal 2010 in poi. I federali statunitensi hanno rafforzato questo e qualsiasi entità non conforme pagherebbe un sacco di dollari in sanzioni.

+0

Sì. Il software che usa MD5 per la sicurezza non sarà ufficialmente considerato il 2010, ma realisticamente, nessuno lo vuole ora perché gli sarà richiesto di sbarazzarsene più tardi (per un valore molto più recente). Quindi, se vendi software o software come servizio, escluderai alcuni clienti attraverso l'uso di MD5. Utilizzare SHAx, preferibilmente con un valore elevato di x. – quillbreaker

+1

Per quanto ne so, MD5 non è mai stato incluso nello standard NIST. Ciò che viene eliminato dal NIST è SHA-1 e in pratica tutto ciò che ha 80 o meno sicurezza. Anche le aziende che non implementano gli standard NIST non vengono multate.Semplicemente non possono ottenere la certificazione NIST e quindi perdono clienti che richiedono tale certificazione. – Accipitridae

Problemi correlati