HMAC può perdere la password? [duplicare]

0

Imaging del seguente pseudo-codice:

h = hash(sha512)
h.input(password)
h.input(message)
send h, message to client

Se l'utente ha l'hash e il messaggio, e l'unica variabile mancante è la password, allora perché non puoi decodificare la password senza forzarla bruta? La matematica mi ha insegnato che se hai due delle tre variabili, puoi sempre calcolare quella mancante.

    
posta Soviero 20.08.2014 - 18:19
fonte

1 risposta

1

Ciò che Math ti ha detto è corretto se assumi unicità e uguaglianza. Ad esempio, da a = b + c, segue che b = a - c. Perché? L'addizione ha una funzione inversa che associa di nuovo una coppia di numeri interi a un numero intero univoco. Se pensi di + come una funzione con notazione infix e due argomenti. Pensa a - come l'inverso di quella funzione. Quindi otterresti: a = + (b, c), e quindi b = - (a, c).

Allo stesso modo, potresti pensare a hash come una funzione con due argomenti. E l'inverso sarebbe una funzione hash '. Discuterò l'esistenza di tale hash ' sotto. Quindi, avremmo ottenuto

h = hash ( m , p ).

Tuttavia, non avremmo ottenuto m = hash ( h , p ).

Perché? La semplice risposta è che non esiste un unico v tale che h abbiamo quel h = hash ( v ). Il principio del pigeonhole ci dice che ci devono essere collisioni per hash (significa che devono esistere alcuni h per i quali ci sono v1 e v2 tale che hash ( v1 ) = h = hash ( v2 )). Questo perché la lunghezza delle immagini sotto hash è fissa. La lunghezza degli input di hash , tuttavia, non sono limitati. Pertanto non esiste una funzione hash ' che restituisca un singolo valore. Preferirebbe restituire qualcosa come un insieme di valori.

La tua domanda è perché non possiamo trovare tali valori con (semplicemente?) reverse engineering hash . La risposta a questa domanda sta nel modo in cui vengono costruite tali funzioni di hash. Il loro scopo è quello di comprimere e offuscare, il che significa che una piccola variazione nell'input deve comportare enormi cambiamenti nell'output. Se hai bisogno di spiegazioni più precise, ti consiglio di guardare una semplice funzione di hash come md5. Il codice sorgente è pubblicamente disponibile. Prova a "invertirlo"!

    
risposta data 20.08.2014 - 21:26
fonte

Leggi altre domande sui tag