Qual è la probabilità di collisione di MD5 quando vengono rimossi valori non numerici?

0
  1. Inizia con un identificativo univoco

    String macAddress = "CC:3A:61:24:D6:96";

  2. Hash l'identificatore tramite l'implementazione MD5

    String hash = md5(macAddress); //bd37f780e10244cf28810b969559ad5b

  3. Rimuovi tutte le lettere dall'hash

    String result = hash.replaceAll("[^\d.]", "");

    result == "3778010244288109695595"

Sto usando MD5 per rendere anonimi gli indirizzi MAC dei nostri utenti. Il nostro attuale servizio web non accetta lettere per il valore che desidero impostare, quindi ho semplicemente rimosso le lettere. Sono cauto questo aumenterà le possibilità di una collisione all'interno del nostro database, quindi vengo qui con la domanda:

Quanto è probabile che result entri in collisione con un input macAddress diverso rispetto a hash ?

    
posta kiansheik 18.07.2014 - 20:30
fonte

2 risposte

2

Non fidarti troppo di questo anonimato. Infatti, gli indirizzi MAC si adattano a 48 bit, di cui due vengono utilizzati per ragioni amministrative, lasciando solo 46 bit (al massimo ) sconosciuto a qualcuno desideroso di recuperare gli indirizzi MAC (in effetti, l'utente malintenzionato può presumere che l'indirizzo MAC da una macchina utente fisica sarà "unicast" e "globalmente univoco", quindi i due bit meno significativi del primo byte saranno 0 ).

Una buona GPU sarà in grado di calcolare più di 2 33 al secondo (vedi benchmark qui ; la macchina con 8 AMD R9 290X raggiunge oltre 93 miliardi di MD5 al secondo); in modo che una singola GPU pronta all'uso possa sgranare lo spazio 2 46 completo in un paio d'ore.

Ancora più importante, il recupero degli indirizzi MAC per il tracciamento delle persone ha senso solo per un utente malintenzionato che ha indirizzi MAC noti da tracciare. L'attaccante non ha bisogno di hash tutti i 2 46 possibili indirizzi MAC, solo le poche dozzine (o centinaia o migliaia o addirittura milioni) che sta cercando di seguire. Un laptop di base, senza GPU, può farlo in una frazione di secondo.

Detto questo, la domanda che hai posto ha ancora un significato matematico. Se supponiamo che le uscite MD5 siano valori "per lo più casuali" nello spazio 2 128 , allora ogni carattere nella stringa esadecimale ha probabilità 10/16 di essere una cifra, indipendentemente dalle altre cifre. Tutti gli input possibili rientrano in una delle 33 categorie per le 33 lunghezze possibili per le stringhe risultanti (da 0 a 32 cifre). La probabilità di un output MD5 di rientrare nella categoria n , cioè di contenere cifre n e 32- n non cifre, è:

P n = (32! / ( n ! (32- n )!)) · (10/16) n · (6/16) 32 n

In media, se hai k indirizzi MAC, otterrai z n = k · P n valori nella categoria n e puoi aspettarti una collisione quando quel numero z n inizia ad avvicinarsi alla radice quadrata dello spazio di valori possibili in quella categoria, cioè 10 n . In altre parole, quando k raggiunge 10 n / 2 / P n per alcuni n , sei nei guai.

Prendiamo alcuni numeri su questo; la soglia per le varie categorie è:

n =  0  ->           42756232765793.7
n =  1  ->            2535132744529.3
n =  2  ->             310327495880.8
n =  3  ->              58880502453.6
n =  4  ->              15409365312.7
n =  5  ->               5220931252.0
n =  6  ->               2201337901.8
n =  7  ->               1124508269.7
n =  8  ->                682753416.9
n =  9  ->                485787572.5
n = 10  ->                400746570.8
n = 11  ->                380181578.5
n = 12  ->                412196472.8
n = 13  ->                508357082.1
n = 14  ->                710713497.4
n = 15  ->               1123736707.7
n = 16  ->               2006720463.1
n = 17  ->               4045452147.9
n = 18  ->               9210846925.9
n = 19  ->              23717908021.4
n = 20  ->              69233179091.0
n = 21  ->             229881262361.1
n = 22  ->             872338056547.2
n = 23  ->            3806833704700.6
n = 24  ->           19261224288561.1
n = 25  ->          114205011141017.5
n = 26  ->          804844014914874.4
n = 27  ->         6871878670370940.0
n = 28  ->        73015449033077408.0
n = 29  ->      1004393786461416580.0
n = 30  ->     19057032197633204000.0
n = 31  ->    560451732845470400000.0
n = 32  ->  34028236692093846000000.0

Bottom-line: quando hai hash gli indirizzi MAC con la regola "rimuovi lettere da esadecimali", dovresti vedere la prima collisione apparire quando hai hash circa 380 milioni di indirizzi; ci si aspetta che le prime collisioni siano per stringhe di lunghezza compresa tra 10 e 12 caratteri.

Mentre 380 milioni è ancora un numero elevato, è considerevolmente inferiore ai valori normalmente previsti da una funzione hash con 128 bit di output; se in qualche modo manteneste l'output MD5 effettivo, saresti al sicuro fino a circa 2 64 hash degli indirizzi MAC, cioè molto più di quanto sia effettivamente possibile, dal momento che ci sono solo 2 48 possibili indirizzi MAC (2 46 in pratica, come spiegato sopra).

Pertanto , se vuoi cancellare gli indirizzi MAC, ti suggerisco caldamente di rimuovere non le lettere. Invece, se devi avere cifre e solo cifre, usa una codifica che conserva tutte le informazioni. L'uscita MD5 è 16 byte; la rappresentazione esadecimale di 32 caratteri è proprio questo: una rappresentazione. È possibile utilizzare una rappresentazione alternativa che produce solo cifre. Ad esempio, è possibile interpretare il valore MD5 come un grande numero intero e codificarlo nella base 10. Il codice Java corrispondente sarebbe simile a questo:

// MD5 output is a byte[], in variable md5out
String result = new BigInteger(1, md5out).ToString();

Poiché l'output MD5 è di 16 byte, il numero intero risultante può contenere al massimo 39 cifre.

Ma ricorda quello che ho scritto all'inizio: come un sistema anonimo per gli indirizzi MAC, una funzione di hash non è un ottimo strumento ... per lo più ostacolerà gli intercettatori occasionali, ma perché un tale intercettatore sarebbe interessato agli indirizzi MAC? Comunque ? Non è un'informazione che puoi usare "su Internet". Gli attaccanti competenti che sono in grado di sfruttare gli indirizzi MAC, d'altra parte, saranno in grado di vedere attraverso un livello così anonimo.

    
risposta data 18.07.2014 - 21:44
fonte
0

Il checksum MD5 medio espresso come stringa esadecimale (come si sta facendo) ha 20 cifre e 12 lettere. Strippare le lettere significa che l'MD5 modificato ha circa 10 ^ 20 o 2 ^ 66 bit di output. Le probabilità di una collisione sono la radice quadrata dello spazio di output, o circa 2 ^ 33 - hai bisogno, in media, di 8,5 miliardi di indirizzi MAC per generare una collisione.

Per i tuoi scopi, probabilmente è abbastanza buono. Se fosse necessario memorizzare tutti i 2 ^ 64 possibili indirizzi MAC, non lo sarebbe (ma nemmeno MD5 non modificato).

    
risposta data 18.07.2014 - 21:43
fonte

Leggi altre domande sui tag