Cosa fa questo strumento
Calcola l'hash SHA-1 di qualsiasi testo o file nel tuo browser, restituendo un digest esadecimale di 40 caratteri. SHA-1 è una funzione di hash a 160 bit pubblicata dal NIST nel 1995 (FIPS 180-1), progettata dalla NSA. È deprecata per scopi di sicurezza: un attacco di collisione pratico (« SHAttered ») è stato dimostrato da Google e CWI Amsterdam nel 2017, e le collisioni a prefisso scelto sono seguite nel 2019. SHA-1 non è più considerato crittograficamente sicuro.
Dove SHA-1 è ancora presente
- ID di oggetti git. Ogni commit, tree e blob git è identificato dal suo hash SHA-1. Il modello a oggetti di git si sta muovendo verso SHA-256 (il flag
--object-format=sha256esiste), ma SHA-1 resta il default per la grande maggioranza dei repository. Il rischio di collisione per gli ID di commit è reale ma gestito: GitHub e altre forge implementano un rilevamento stile SHAttered (la libreriasha1dc) per segnalare collisioni preparate. - Subversion (SVN). Stesso ragionamento di git, meno sforzo di migrazione in corso.
- Vecchi certificati TLS. I browser hanno smesso di fidarsi dei certificati firmati in SHA-1 nel 2017, ma sistemi legacy ne producono ancora.
- Codice esistente che hasha per ragioni non di sicurezza. Chiavi di cache, impronte, tabelle di deduplicazione — vanno tutte bene.
Quando SHA-1 non è adatto
- Nuovi certificati TLS, certificati di code-signing o firme di documenti. Usa SHA-256 o SHA-384.
- Archiviazione password. Usa un hash lento e salato come bcrypt o Argon2. SHA-1 è troppo veloce e non progettato per questo.
- Qualsiasi cosa dove un attaccante può scegliere l'input. Un attaccante determinato con un cluster in affitto può produrre una collisione SHA-1 in giorni. Se il tuo modello di sicurezza lascia all'attaccante influenzare cosa viene hashato, SHA-1 è rotto.
- Subresource Integrity (SRI). I browser accetteranno SHA-1 negli attributi
integrity, ma la spec raccomanda SHA-256 minimo.
Vettori di test
Da FIPS 180-2 e dalla suite di riferimento SHA-1:
- Stringa vuota
""→da39a3ee5e6b4b0d3255bfef95601890afd80709 "abc"→a9993e364706816aba3e25717850c26c9cd0d89d"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"→84983e441c3bd26ebaae4aa1f95129e5e54670f1"The quick brown fox jumps over the lazy dog"→2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Note
Perché 40 caratteri? SHA-1 produce 160 bit = 20 byte. 20 byte × 2 caratteri hex per byte = 40 caratteri visibili.
Perché git usa SHA-1 se è rotto? Git usa SHA-1 come identificatore content-addressable, non come primitiva di sicurezza. Il modello di minaccia è « due oggetti ben formati collidono accidentalmente », che è ancora astronomicamente improbabile. Il modello di minaccia non è « un attaccante pusha un commit malevolo che ha lo stesso hash del tuo commit reale » — per quello, GitHub ecc. usano sha1dc per rilevare preparazioni stile SHAttered e rifiutarle. La migrazione a SHA-256 sta avvenendo ma lentamente perché la base installata è enorme.
Perché il mio SHA-1 differisce da quello che restituisce sha1sum? Newline finale. echo "hello" | sha1sum include il \n. Incollare "hello" qui no. Usa echo -n o il selettore di file.
Strumenti correlati
- Generatore di hash — cinque hash affiancati
- SHA-256 — il sostituto moderno di SHA-1
- MD5 — il predecessore; ancora più profondamente rotto