Generatore Hash SHA-1
Genera hash SHA-1 da qualsiasi testo
Testo di input
Hash SHA-1
L'hash SHA-1 apparirà qui…
Cos'è l'hashing SHA-1?
SHA-1 (Secure Hash Algorithm 1) è una funzione hash crittografica che produce un digest fisso di 160 bit (20 byte) da qualsiasi input. Pubblicato dalla NSA e standardizzato dal NIST nel 1995 come FIPS PUB 180-1 e successivamente documentato nell'RFC 3174, SHA-1 è stato progettato come successore più robusto di SHA-0 e MD5. L'algoritmo elabora l'input in blocchi da 512 bit attraverso 80 cicli di operazioni bit a bit, producendo un'impronta esadecimale di 40 caratteri che per oltre un decennio ha costituito la base di SSL/TLS, PGP, SSH e IPsec.
Come tutte le funzioni hash crittografiche, SHA-1 è una trasformazione unidirezionale: calcolare l'hash a partire da un input è rapido, ma risalire all'input dal solo hash è computazionalmente impossibile. Un cambiamento di un singolo bit nell'input produce un digest di 160 bit completamente diverso — una proprietà chiamata effetto valanga. SHA-1 mappa uno spazio di input arbitrariamente grande in un output fisso di 160 bit, il che significa che le collisioni (due input diversi che producono lo stesso hash) devono esistere matematicamente. La garanzia di sicurezza di una funzione hash è che trovare tali collisioni dovrebbe richiedere circa 2^80 operazioni — la metà della lunghezza in bit dell'output.
Nel 2017, Google e CWI Amsterdam hanno pubblicato l'attacco SHAttered, dimostrando la prima collisione SHA-1 pratica producendo due file PDF diversi con lo stesso digest. L'attacco ha richiesto circa 2^63.1 computazioni SHA-1 — ben al di sotto del limite teorico di 2^80. Nel 2020, Gaetan Leurent e Thomas Peyrin hanno ulteriormente ridotto il costo con un attacco a collisione a prefisso scelto richiedente circa 2^63.4 operazioni. Di conseguenza, tutti i principali browser, le autorità di certificazione e gli organismi di standardizzazione hanno deprecato SHA-1 per firme digitali e certificati TLS. Tuttavia, SHA-1 rimane in uso attivo per scopi non legati alla sicurezza: ID degli oggetti Git (anche se Git sta migrando a SHA-256), costruzioni HMAC legacy e checksum di integrità dei file dove la resistenza alle collisioni avversariali non è richiesta.
Perché usare questo generatore SHA-1?
Genera hash SHA-1 all'istante senza installare nulla né scrivere codice. Incolla il tuo testo e ottieni il digest esadecimale di 40 caratteri in tempo reale — utile per verificare checksum legacy, fare debug degli internals di Git o testare flussi di lavoro basati sugli hash.
Casi d'uso di SHA-1
SHA-1 vs altri algoritmi hash
SHA-1 produce un digest di 160 bit — più lungo di MD5 (128 bit) ma significativamente più corto degli algoritmi della famiglia SHA-2. La tabella seguente confronta le dimensioni dei digest, gli standard e i casi d'uso appropriati per ciascun algoritmo.
| Algoritmo | Dimensione digest | Lunghezza esadecimale | Standard | Ideale per |
|---|---|---|---|---|
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Deprecated — legacy git commits, old TLS |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums only — broken since 2004 |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, alternative to SHA-2 |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
Come funziona SHA-1
SHA-1 segue la costruzione di Merkle-Damgard: il messaggio viene aggiunto con padding, suddiviso in blocchi da 512 bit e ciascun blocco viene elaborato attraverso 80 cicli di operazioni bit a bit che mescolano l'input con una schedulazione dei messaggi derivata dal blocco. Cinque parole di stato da 32 bit (da H0 a H4) mantengono lo stato hash in esecuzione, e la concatenazione finale di queste parole produce il digest di 160 bit.
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| Passo | Descrizione |
|---|---|
| Padding | Append a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Expansion | Expand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule. |
| Compression | Process 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79. |
| Output | Concatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters. |
La differenza chiave tra SHA-1 e MD5 è il numero di parole di stato (5 contro 4), il numero di cicli per blocco (80 contro 64) e l'uso di una schedulazione dei messaggi con feedback di rotazione a sinistra. Queste differenze danno a SHA-1 un output più grande (160 contro 128 bit) e fornivano originariamente un margine di sicurezza superiore, sebbene entrambi gli algoritmi siano ora considerati vulnerabili per la resistenza alle collisioni.
Esempi di codice
Come generare hash SHA-1 nei linguaggi e ambienti più diffusi. A differenza di MD5, SHA-1 è disponibile nella Web Crypto API del browser, rendendolo utilizzabile senza librerie esterne sia in ambiente browser che Node.js.
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"import hashlib
# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result) # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a file in chunks
with open('file.bin', 'rb') as f:
sha1 = hashlib.sha1()
for chunk in iter(lambda: f.read(8192), b''):
sha1.update(chunk)
print(sha1.hexdigest())package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha1.Sum(data)
fmt.Printf("%x\n", hash)
// → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}# Using sha1sum (Linux) or shasum (macOS) echo -n "hello world" | sha1sum # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # macOS echo -n "hello world" | shasum -a 1 # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # Hash a file sha1sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl sha1 # → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed