Hash irreversibile senza collisione

4

Stiamo cercando di consentire agli utenti di accedere con una smart card. Il lettore di smart card può leggere l'ID della smart card e inviarcelo.

Tuttavia, non è consentito memorizzare l'ID della smart card. Non in testo normale, non in una codifica reversibile. È consentito un hashing irreversibile .

Quindi, di nuovo, dobbiamo assicurarci che ogni ID hash a un risultato univoco , in modo da evitare collisioni.

Come possiamo soddisfare entrambe le proprietà uniche e irreversibili ?

    
posta Konerak 26.11.2013 - 08:44
fonte

4 risposte

16

Affinché un hash sia privo di collisioni, ogni input univoco dovrebbe essere mappato su un output univoco. Se ogni uscita è unica, ciò significa che può essere mappato in senso inverso a un input univoco. Quello non sarebbe hashing, sarebbe solo una codifica. La collisione e la non reversibilità si escludono a vicenda per definizione.

Il punto importante è come probabile è una collisione, e la risposta per gli hash moderni è negligibilmente improbabile . Se lo spazio della chiave di output è maggiore dello spazio della chiave di input, è estremamente improbabile che tu possa trovare una collisione, e anche se non è così improbabile da non meritare di essere preso in considerazione nel mondo reale.

Direi che quegli ID di smart card non sono molto complessi, probabilmente numeri decimali della stessa lunghezza (ad esempio 1234567890). Ciò significa che non ci sono molti input possibili ed è probabilmente possibile calcolare gli hash di tutti i possibili ID in un tempo ragionevole, creando una tabella di ricerca per invertire gli hash. In questo caso, ti consigliamo di utilizzare un hash lento come bcrypt, scrypt, PBKDF2 ecc. Per rendere questo non possibile.

Più ci penso, meno il requisito ha senso. Il segreto qui dovrebbe essere tra la carta e il lettore, e trust deve essere tra il lettore e il sistema a cui è connesso. Perché è un problema di sicurezza se è noto l'ID di una carta? Cosa può fare qualcuno con questo id se lo ottiene? Se la risposta è che l'ID è un segreto e qualcuno può fare quello che vuole se conosce il numero di identificazione, questa è una scarsa sicurezza. La sicurezza qui dovrebbe derivare dal fatto che è necessario avere il possesso fisico della carta, il che significa che i segreti sono tutti tra la carta e il lettore. Oltre a questo c'è solo un utente autenticato con un id, che è una necessità semplice per far funzionare il sistema.

    
risposta data 26.11.2013 - 09:26
fonte
3

Utilizza la funzione hash a 512 bit come SHA-2-512 e quando aggiungi una scheda "smart" al database, controlla se l'hash esiste già. In un caso ESTREMAMENTE DISCRICENTE, non usare la carta. Anche con migliaia di miliardi di ID univoci, è improbabile che si verifichi una singola collisione.

    
risposta data 26.11.2013 - 09:01
fonte
1

Come ha detto @deceze, una funzione di hash crittografica non può anche essere un hash perfetto funzione per il tuo spazio chiave.

Quindi, invece di richiedere che tutti i risultati siano unici, dovresti concentrarti sulla gestione della collisione correttamente.

Ci sono molte opzioni per questo (cerca l' articolo di wikipedia sulle tabelle di hash , è scritto abbastanza bene) ma loro tutto dipende da ciò che non ci hai detto: cosa vuoi fare con quell'ID.

Se vuoi usarlo per identificare un utente che usa quell'ID e non hai altro elemento, in teoria non c'è modo di impedire che una collisione si verifichi mentre si ripristina ancora la proprietà di non reversibilità dell'hash. Tutto quello che puoi fare è ridurre le probabilità di collisione se le consideri troppo alte (ma, come notato da @Matrix, le probabilità di una collisione sono molto basse e dovrebbero essere controllate prima di assegnare una carta).

Se si dispone di un'altra proprietà fornita, ad esempio una password hash, è possibile utilizzare il risultato dell'hash per identificare tutte le righe potenzialmente valide e quindi utilizzare una ricerca più costosa (ad esempio, controllando la password fornita su ciascuno di queste righe) per identificare quello corretto.

In pratica, tuttavia, non mi preoccuperei troppo della collisione, a meno che tu non abbia intenzione di emettere un numero veramente elevato di carte (milioni).

    
risposta data 26.11.2013 - 10:32
fonte
1

Considera questa immagine prima di preoccuparti delle possibilità di una collisione. Gli indirizzi Bitcoin sono l'output con hash di una chiave, che nel tuo caso sarebbe l'ID della smartcard. Come puoi vedere, l'intervallo di indirizzi è piuttosto ampio e quindi una collisione abbastanza improbabile.

In effetti, è considerato così improbabile che gli indirizzi vengano generati senza timore che qualcun altro possa aver generato lo stesso indirizzo, anche se ciò potrebbe causare una perdita finanziaria significativa per un utente a cui questo è successo.

Quindi è necessario (teoricamente) sceglierne uno, unico o irreversibile. Tuttavia, considera estremamente improbabile che ti debba preoccupare che un problema sia univoco, quindi scegli semplicemente un algoritmo di hash ragionevole come SHA-512 che ha un pool molto grande.

    
risposta data 26.11.2013 - 15:55
fonte

Leggi altre domande sui tag