toooly-box

Generatore di hash

Scrivi o incolla un testo e ottieni tutti i digest più comuni in una volta, con un campo per confrontarne uno con un valore pubblicato.

elaborazione locale
Generatore di hash
MD5 128 bitrotto
SHA-1 160 bitrotto
SHA-256 256 bit
SHA-384 384 bit
SHA-512 512 bit

MD5 e SHA-1 sono rotti: si possono costruire due input diversi con lo stesso digest. Usali per verificare un download contro un checksum pubblicato, mai per dimostrare chi ha scritto qualcosa.

Che cos'è un hash?

Un hash è un'impronta di lunghezza fissa di un dato, prodotta da una funzione a senso unico. Lo stesso input dà sempre lo stesso hash; un solo byte diverso ne dà uno completamente diverso; e dall'hash non si torna indietro al dato. Serve a verificare l'integrità, non a nascondere.

Come funziona

Un hash legge i tuoi byte e produce un’impronta di lunghezza fissa: 32 caratteri esadecimali per MD5, 64 per SHA-256, 128 per SHA-512, che l’input sia una lettera o un megabyte.

I digest SHA arrivano da SubtleCrypto, l’implementazione crittografica del browser. MD5 non c’è in SubtleCrypto, di proposito, perché è rotto, quindi è implementato qui e verificato contro i sei vettori di test pubblicati nella RFC 1321.

Il testo viene letto come UTF-8 prima di essere hashato: è l’unico default sensato ed è anche il motivo più frequente per cui due strumenti non concordano, perché lo stesso carattere visibile hashato in Latin-1 dà un digest completamente diverso.

Che cos’è una funzione di hash

Una funzione di hash trasforma una quantità qualsiasi di dati in un valore corto e di lunghezza fissa, e lo fa sempre allo stesso modo. Lo stesso input dà sempre lo stesso digest, un singolo byte cambiato ne dà uno completamente diverso, e la dimensione dell’uscita non cambia mai: è questo che la rende utile come impronta di dati che vuoi confrontare senza conservare né trasmettere i dati stessi.

Quello che non è, è reversibile. Per un hash non esiste un «decifra»: la funzione butta via informazione, ed è proprio il punto. Un digest si può cercare in una tabella di input comuni già calcolati, ed è esattamente così che vengono bucati gli archivi di password trafugati, ma non si può eseguire al contrario. Se ti serve recuperare l’originale volevi la cifratura, non l’hash.

Quale algoritmo serve per cosa

  • SHA-256 il default ragionevole. Veloce, non rotto, e quello su cui si è standardizzato quasi tutto: certificati, oggetti Git dopo la transizione, blockchain, token firmati.
  • SHA-512 lo stesso progetto con parole più grandi. Spesso più veloce di SHA-256 su hardware a 64 bit, ed è la scelta giusta quando vuoi margine invece di compatibilità.
  • SHA-384 SHA-512 troncato. Esiste perché alcuni standard richiedono un digest di 384 bit; per il resto non lo consiglia nessuno.
  • SHA-1 rotto dal 2017, quando è stata pubblicata una collisione praticabile. Sta ancora dappertutto nella storia di Git e nei vecchi certificati, quindi devi poterlo calcolare, ma mai dimostrarci niente.
  • MD5 rotto molto prima e molto peggio: le collisioni si costruiscono in pochi secondi su un portatile. È ancora il checksum stampato sulle pagine di download, quindi vale la pena averlo, solo per far quadrare un valore pubblicato.

Verificare un download, l’uso onesto di un hash rotto

Un checksum accanto a un download risponde a una domanda sola: il file è arrivato integro. Per quello va bene anche MD5, perché un errore di trasferimento è casuale e non produrrà per caso un file che collide. Incolla il digest pubblicato nel campo di confronto, hasha la tua copia e guarda se coincidono.

Quello che un checksum sulla stessa pagina del download non dice è se il file è autentico. Chi può sostituire il file può sostituire anche il digest che gli sta accanto, ed è il motivo per cui i progetti seri firmano il file dei checksum con una chiave invece di limitarsi a stamparlo. Se digest e file vengono dallo stesso posto e dalla stessa fiducia, hai verificato il trasporto, non la paternità.

E una discordanza non è quasi mai un attacco. In ordine di probabilità: hai hashato il testo della pagina invece del file, il file sta ancora scaricando, un editor ha aggiunto un a capo finale, o sono cambiati i fine riga tra Windows e Unix. Un solo byte invisibile di differenza cambia ogni carattere del digest, ed è il motivo per cui il confronto è utile ed è anche il motivo per cui non perdona.

Quando due strumenti non concordano

  • Un a capo finale la causa più comune, di gran lunga. Quasi tutti gli editor ne aggiungono uno al salvataggio; echo lo aggiunge se non passi -n. Il digest di «abc» e quello di «abc\n» non hanno nulla in comune.
  • La codifica il testo deve diventare byte prima di poter essere hashato. Qui si usa UTF-8; uno strumento che parte da Latin-1 concorderà sull’ASCII puro e smetterà al primo accento.
  • I fine riga un file scritto su Windows ha \r\n dove uno Unix ha \n. Stesso testo, byte diversi, hash diverso, e un motivo per hashare il file invece del suo contenuto incollato.
  • Esadecimale maiuscolo o minuscolo è estetica. 8F e 8f sono lo stesso byte, e il confronto qui ignora la differenza.
  • Hashare il file o hashare il testo un file porta esattamente i suoi byte; incollarne il contenuto in una casella di testo può normalizzare gli spazi o togliere un BOM. Per un checksum, usa il file.

Hash, salt e perché le password sono un altro discorso

Nessuno di questi algoritmi è il modo giusto di conservare una password, e vale la pena dirlo chiaramente perché è l’uso sbagliato più diffuso di tutti. Sono fatti per essere veloci, e veloce è esattamente la cosa sbagliata: chi ha in mano un archivio trafugato vuole provare miliardi di tentativi, e un hash veloce lo aiuta.

  • Salt un valore casuale conservato accanto a ogni hash di password, così due persone con la stessa password ottengono digest diversi e una sola tabella precalcolata non le buca entrambe.
  • Un hash lento bcrypt, scrypt o Argon2. Costosi di proposito, regolabili man mano che l’hardware diventa più veloce, e quello attraverso cui una password dovrebbe davvero passare.
  • HMAC un hash con una chiave, per dimostrare che un messaggio arriva da chi possiede la chiave. È quello che firma un JWT; un hash nudo non dimostra nulla sull’origine.
  • Collisione due input con lo stesso digest. È il motivo per cui MD5 e SHA-1 sono in pensione: una collisione si può costruire di proposito, quindi un digest che coincide non significa più contenuto che coincide.
  • Checksum contro hash crittografico CRC32 intercetta la corruzione accidentale ed è banale da falsificare. SHA-256 intercetta entrambe, ed è il motivo per cui solo uno dei due ha senso in una firma.

Domande frequenti

Che differenza c’è tra MD5 e SHA-256?

MD5 dà un digest di 128 bit ed è rotto: le collisioni si costruiscono in pochi secondi. SHA-256 dà 256 bit e non ha attacchi praticabili. Usa MD5 solo per far quadrare un checksum pubblicato.

Si può invertire un hash?

No. La funzione scarta informazione, quindi non c’è nulla da invertire. I siti che offrono di «decifrare» un hash lo cercano in una tabella di input comuni già calcolati.

Perché il mio digest è diverso da quello di un altro strumento?

Quasi sempre per un a capo finale, o per una codifica diversa. «abc» e «abc\n» non hanno nessuna parte del digest in comune, e UTF-8 contro Latin-1 cambia tutto appena c’è un accento.

MD5 va ancora bene per verificare un download?

Per accorgersi di un trasferimento corrotto sì: un danno casuale non produce collisioni. Per dimostrare che un file è autentico no: chi può sostituire il file sostituisce anche il digest stampato accanto.

Posso usare SHA-256 per conservare le password?

No. È troppo veloce, e la velocità aiuta chi ti rubasse il database. Le password hanno bisogno di un hash lento di proposito con un salt per utente: Argon2, bcrypt o scrypt.