SHA-1 produce un hash a 160 bit. L'hashing di un file più lungo di 160 bit (20 ottetti) perderà quindi necessariamente le informazioni e rende impossibile la ricostruzione. In teoria, cioè.
D'altra parte, i file di hashing più brevi di 20 ottetti sono altamente probabili (praticamente garantiti) per produrre una mappatura 1: 1. Una mappatura 1: 1 significa che senza sale, è banale riportare l'hash ai contenuti originali con una tabella arcobaleno facilmente esistente. Anche con un tipico sale non segreto, è molto possibile eseguire un attacco a forza bruta su file molto brevi, quindi se si è preoccupati di ciò, è necessario aggiungere un sale sufficientemente lungo (ad esempio, 128 bit) e mantenere il segreto del sale (non è come si usa normalmente un sale, ma si ha anche una situazione diversa). Puoi aggiungere ulteriormente il nome di ogni file a the salt (a meno che ciò che stai cercando di fare sia la deduplicazione), quindi file diversi con contenuti identici hanno hash diversi.
In pratica, sebbene l'hash non possa essere invertito per i file più grandi di 20 ottetti, i file piccoli (ma più grandi di 20 ottetti) potrebbero ancora essere invertiti se l'attaccante è sufficientemente persistente. Ad esempio, esistono 65536 file con 22 ottetti [1] che hanno lo stesso SHA-1 e non è possibile dimostrare quale sia quello corretto. O puoi?
Sfortunatamente la risposta è "sì". Sebbene ognuno di questi 65 file diversi sia una soluzione ugualmente valida dal punto di vista dell'hash, solo uno di essi (o forse due) sarà qualcosa che non è una spazzatura binaria casuale priva di senso. Che è banale da identificare usando un programma di compressione generico (i file di testo in chiaro sono comprimibili, la spazzatura casuale non lo è). Inoltre, se il nome di un file è noto, di solito è relativamente facile controllarne il contenuto rispetto ad alcuni magici byte o ad una particolare struttura. L'utente malintenzionato deve solo considerare i file che hanno byte magici che corrispondono al loro tipo.
Fortunatamente, questo attacco diventa rapidamente poco pratico. Ci sono già 10 file 28 di lunghezza 32 che si associano allo stesso hash e la maggior parte dei file su ogni computer è più lunga!
E ora ecco una sorpresa: il "più sicuro" SHA-512 è in realtà meno sicuro a tale riguardo. Poiché esegue 512 bit, eseguirà un mapping 1: 1 per file fino a 64 byte .
La mia raccomandazione sarebbe:
- Se davvero non vuoi (o non puoi) usare TLS / SSH (sai che
rsync
farà l'intero hash comparativo inclusa connessione SSH per te, don ' t you?), utilizzare un contenitore di crittografia come ad es Truecrypt. Ciò impedirà a qualcun altro di accedere agli hash anche se pubblichi il contenitore su Internet su un server non affidabile o se li invii via email.
Questo rende ogni altra considerazione obsoleta. Non c'è bisogno di preoccuparsi se gli hash possono essere ripristinati se l'attaccante non li conosce!
- Non utilizzare un hash più grande del necessario. La possibilità di una collisione casuale di hash in 10 16 file (cioè 10 miliardi di volte il numero di file presenti sul mio computer desktop!) Con un hash a 160 bit è di circa 10 -15 . Per diecimila file, è 10 -22 . In altre parole, non succederà nella tua vita. Set di controlli di revisione come ad es. Git fa affidamento sul fatto che le collisioni semplicemente non accadono. Gli hash più grandi non rendono nulla di meglio nel tuo scenario, ma potrebbero addirittura peggiorare le cose (per i file di piccole dimensioni).
- Salta il contenuto del file con nomi di file e con una quantità di sale casuale sufficientemente lunga da mantenere segreta.
- Considera anche i nomi dei file di hashing, poiché i nomi dei file da soli possono trasmettere informazioni importanti.
- Non trasmettere lunghezze di file. Non ti dà un vantaggio, ma può darlo a un utente malintenzionato.
[1] In realtà, se non comunichi all'attaccante la lunghezza del file, ce ne sono ancora di più: ci sono anche 256 file con 21 ottetti e uno con 20 o meno.