2015-07-16 34 views
11

Desidero generare uuidi unici crittograficamente protetti utilizzando php.ID univoco protetto da crittografia

uniqid() fornisce ID univoci ma non sicuri e openssl_random_pseudo_bytes() fornisce ID sicuri ma non univoci. La combinazione dei due (codice seguente) è un approccio corretto o esiste una soluzione migliore?

uniqid(bin2hex(openssl_random_pseudo_bytes(10)), true); 

risposta

-1

Perché non eseguire l'hashing dell'output di openssl_random_pseudo_bytes? Si potrebbe anche concat un timestamp e hash è poi

md5(bin2hex(openssl_random_pseudo_bytes(10)).strval(time())); 

Utilizzando md5 tanto per fare un esempio. È possibile utilizzare qualsiasi algoritmo di hash.

+0

Cosa otterrebbe? – Cybergibbons

+1

MD5 non è un algoritmo di hash sicuro. – starbeamrainbowlabs

7

Voglio generare uuidi unici crittograficamente protetti utilizzando php.

Ok, è facile.

uniqid() fornisce ID univoci ma non sicuri e openssl_random_pseudo_bytes() fornisce ID sicuri ma non univoci.

Cosa ti fa pensare che lo cryptographically secure pseudorandom number non sia univoco?

/** 
* Return a UUID (version 4) using random bytes 
* Note that version 4 follows the format: 
*  xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx 
* where y is one of: [8, 9, A, B] 
* 
* We use (random_bytes(1) & 0x0F) | 0x40 to force 
* the first character of hex value to always be 4 
* in the appropriate position. 
* 
* For 4: http://3v4l.org/q2JN9 
* For Y: http://3v4l.org/EsGSU 
* For the whole shebang: https://3v4l.org/LNgJb 
* 
* @ref https://stackoverflow.com/a/31460273/2224584 
* @ref https://paragonie.com/b/JvICXzh_jhLyt4y3 
* 
* @return string 
*/ 
function uuidv4() 
{ 
    return implode('-', [ 
     bin2hex(random_bytes(4)), 
     bin2hex(random_bytes(2)), 
     bin2hex(chr((ord(random_bytes(1)) & 0x0F) | 0x40)) . bin2hex(random_bytes(1)), 
     bin2hex(chr((ord(random_bytes(1)) & 0x3F) | 0x80)) . bin2hex(random_bytes(1)), 
     bin2hex(random_bytes(6)) 
    ]); 
} 

L'esempio conforme al UUIDv4 specification e utilizza la funzione di PHP7 random_bytes().

Per PHP 5 progetti, è possibile utilizzare random_compat per Polyfill random_bytes() da PHP 7.

+0

Per chi usa php, vedere https://stackoverflow.com/a/18890309/3774582 per un esempio di openssl_random_pseudo_bytes() per creare un ID univoco protetto da crittografia. – Goose

+1

@Goose Usa random_compat, ** not ** openssl_random_pseudo_bytes: https://github.com/ramsey/uuid/issues/80 –

-1

Anche se la risposta è praticamente superiore corretta, non è teoricamente corretto.

La tua domanda non ha una risposta perfetta neanche.

La sicurezza si basa su casualità imparziale, imprevedibile, vera. Ma qualcosa che è veramente casuale può ripetere sempre o non sarebbe casuale. Un dado a milioni di lati potrebbe atterrare sullo stesso numero un milione di volte di fila, la probabilità che ciò accada è solo molto piccola.

La forza di UUIDv4 è che la probabilità di ottenere lo stesso ID due volte (collisione) è astronomicamente piccola, lo "scegliere lo stesso atomo da una galassia due volte" di tipo piccolo.

Qualsiasi tentativo di aggiungere unicità ridurrà di fatto la sicurezza. È possibile aggiungere un timestamp di microsecondi o un valore di auto-incremento e una coordinata spaziale di precisione millimetrica per garantire l'unicità. Ma poi aggiungi informazioni su dove e come e in quale ordine è stato creato l'ID ...

Ancora una volta, per tutti gli scopi pratici, è sicuro utilizzare UUIDv4 come identificatore univoco e sicuro.

Realizza anche che md5, sha1, uniqid, ecc. Non sono perfetti da soli e unirli in modo casuale non diminuisce necessariamente la collisione né aumenta la sicurezza. Le funzioni di hashing sono nel migliore dei casi uniche come la cosa che stai tagliando, e di solito diminuiscono l'unicità.

La risposta è sempre nella casualità più la lunghezza.

+0

Stiamo parlando di più di un dado da un miliardo e la probabilità di rotolare la stessa cosa x volte è precisamente 'n^x'. È così astronomico che ci sono voluti 6,610 anni di potenza di elaborazione per trovare una collisione sha1. Inoltre, combinandoli certamente riduce le collisioni per il prodotto delle probabilità. – Bluebaron