L'hash sha-1 è sempre lo stesso?

9

È possibile garantire che una stringa venga sottoposta a hashing sempre allo stesso modo, indipendentemente dalla lingua utilizzata per farlo (Java, vb.net ...) e indipendentemente dal sistema operativo in uso?

    
posta eversor 08.08.2012 - 11:53
fonte

4 risposte

23

Le funzioni di hash sono deterministico : lo stesso input restituisce lo stesso risultato. Qualsiasi implementazione di una determinata funzione di hash, indipendentemente dalla lingua in cui è implementata, deve agire allo stesso modo.

Tuttavia , nota che le funzioni di hash accettano sequenze di bit come input. Quando "eseguiamo l'hash di una stringa", convertiamo effettivamente una sequenza di caratteri in una sequenza di bit e poi la cancelliamo. Qui inizia il problema. Considera la stringa "café" : tra tutte le possibili conversioni a bit, tutte le seguenti sono comuni:

63 61 66 e9                             ISO-8859-1 ("latin-1")
63 61 66 ca a9                          UTF-8
63 61 66 65 cc 81                       UTF-8 (NFD)
ef bb bf 63 61 66 ca a9                 UTF-8 (with BOM)
ef bb bf 63 61 66 65 cc 81              UTF-8 (NFD with BOM)
63 00 61 00 66 00 e9 00                 UTF-16 little-endian
00 63 00 61 00 66 00 e9                 UTF-16 big-endian
ff fe 63 00 61 00 66 00 e9 00           UTF-16 little-endian (with BOM)
fe ff 00 63 00 61 00 66 00 e9           UTF-16 big-endian (with BOM)
63 00 61 00 66 00 65 00 01 03           UTF-16 little-endian (NFD)
00 63 00 61 00 66 00 65 03 01           UTF-16 big-endian (NFD)
ff fe 63 00 61 00 66 00 65 00 01 03     UTF-16 little-endian (NFD with BOM)
fe ff 00 63 00 61 00 66 00 65 03 01     UTF-16 big-endian (NFD with BOM)

e tutti produrranno valori hash molto diversi quando elaborati con una determinata funzione di hash. Devi essere molto preciso su ciò che fai quando gestisci le funzioni crittografiche; conta ogni bit.

    
risposta data 03.03.2013 - 21:13
fonte
13

Non sono esattamente sicuro di cosa intendi, ma sì. L'output di una funzione di hash correttamente scritta dovrebbe essere lo stesso indipendentemente dalla lingua.

L'unica differenza tra gli hash delle diverse librerie dei linguaggi di programmazione e su piattaforme diverse sarà la velocità. Anche se in librerie correttamente scritte - la differenza sarà banale.

    
risposta data 08.08.2012 - 11:54
fonte
9

Sì, la stessa "sequenza di byte" esige sempre lo stesso identico valore di digest indipendentemente dall'implementazione (supponendo che sia un'implementazione corretta!)

La parola chiave è sempre vera per "sequenza di byte", ma non sempre per "stringa" come hai scritto tu. A seconda di molte cose, le stringhe possono essere generate in modo diverso su sistemi diversi. Esiste il potenziale per molte differenze di spazio bianco o di fine riga, o problemi di codifica ASCII vs Unicode UTF-16.

Inoltre, tieni presente che quando visualizzi il valore digest, ti imbattono in problemi simili. Diverse implementazioni potrebbero rappresentare cifre esadecimali con valori maiuscoli o minuscoli, quindi un test di uguaglianza delle stringhe potrebbe non riuscire.

    
risposta data 08.08.2012 - 21:31
fonte
3

Sarà sempre lo stesso se non stai usando un sale. Se stai usando un sale, sarà diverso se cambierai il sale.

    
risposta data 08.08.2012 - 11:57
fonte

Leggi altre domande sui tag