Strumenti per sviluppatori · SHA calcolatore hash
Attacchi con estensione della lunghezza: perché SHA-256(segreto + messaggio) non è un MAC
· Perché è importante
sha-256 crittografia sicurezza
Anteporre un segreto a un messaggio e sottoporlo ad hashing sembra un'autenticazione, ma la struttura di SHA-256 consente a un utente malintenzionato di estendere il messaggio senza conoscere il segreto. Questo post spiega l'attacco e la soluzione.
La firma della richiesta fatta in casa: hash (segreto + corpo) e perché sembra sicura
Uno sviluppatore ha bisogno dell'autenticazione del messaggio ma non ha la conoscenza HMAC, quindi concatena un segreto con il messaggio e esegue l'hashing del risultato. Questo approccio sembra inizialmente sicuro: l'output è un'impronta digitale di dimensione fissa che dovrebbe cambiare se qualcuno modifica il messaggio. Tuttavia, SHA-256 presenta un difetto architetturale chiamato estensione della lunghezza che consente a un utente malintenzionato di aggiungere dati al messaggio e calcolare un digest valido senza conoscere il segreto. Il calcolatore hash ToolAcre SHA calcola solo digest semplici, non l'autenticazione con chiave, perché questa distinzione è importante per la sicurezza reale.
Anteporre un segreto prima dell'hashing è intuitivamente interessante perché solo il detentore del segreto può ricalcolare l'hash. Se il messaggio cambia, cambia anche l’hash, quindi sembra una prova di autenticità. Un API potrebbe firmare le richieste concatenando un segreto condiviso e il corpo della richiesta, quindi eseguire l'hashing del risultato e includere tale hash nella richiesta. Il server riceve il corpo, ricalcola l'hash con la sua copia del segreto e controlla se corrisponde. Se un utente malintenzionato modifica il corpo, l'hash non corrisponderà, o almeno così pensano gli sviluppatori.
Merkle–Damgård fa trapelare il suo stato: il digest finale è lo stato interno, quindi un utente malintenzionato può continuare ad eseguire l'hashing dal punto in cui ti sei fermato
SHA-256 appartiene a una famiglia chiamata funzioni hash Merkle–Damgård. Queste funzioni elaborano l'input in blocchi di dimensione fissa, concatenando una funzione di compressione che prende lo stato precedente e il blocco corrente e restituisce un nuovo stato. La funzione di compressione è l'unica primitiva crittografica contenuta; la strategia di concatenamento e lo schema di imbottitura rendono l'intera costruzione un lavoro. Il digest finale è semplicemente lo stato finale stampato in formato esadecimale. Ciò non è casuale: l'output è lo stato interno. Chiunque veda il digest ha lo stato esatto necessario per continuare l'hashing da quel punto.
Per estendere un messaggio, un utente malintenzionato inizia con il digest osservato di secret + original_message e lo tratta come variabile di stato per una nuova chiamata alla funzione di compressione. Aggiungono i dati che desiderano aggiungere, li riempiono correttamente per l'intera lunghezza del nuovo messaggio e calcolano il digest. Quando il server convalida questo digest contraffatto anteponendo il proprio segreto e l'hashing, il calcolo procede in modo identico al calcolo dell'aggressore dopo che il segreto iniziale è stato assorbito. Il server calcola lo stesso digest e il messaggio contraffatto viene accettato senza che l'aggressore ne conosca il segreto.
Come funziona l'estensione: aggiunta di riempimento e dati aggiuntivi per creare un hash valido per un messaggio più lungo
Diversi algoritmi sono influenzati in modo diverso dall'estensione della lunghezza. SHA-1 è vulnerabile: un utente malintenzionato può osservare un digest SHA-1 ed estendere il messaggio. SHA-256 è vulnerabile esattamente allo stesso modo. SHA-512 è anche vulnerabile agli attacchi di estensione. SHA-384 resiste all'estensione della lunghezza perché è costruito come SHA-512 troncato in 384 bits. L'output della funzione di compressione è più lungo del digest pubblicato, quindi l'aggressore non dispone di informazioni sufficienti per continuare l'hashing. Resiste anche la costruzione in spugna utilizzata in SHA-3 perché non lascia trapelare lo stato interno.
Per comprendere quali algoritmi sono vulnerabili è necessario conoscere qualcosa sulla dimensione della funzione di compressione rispetto alla dimensione del digest pubblicato. SHA-256 pubblica 256 bits e anche lo stato della funzione di compressione è 256 bits, quindi il digest è l'intero stato. Un utente malintenzionato ha tutto il necessario per continuare. SHA-384 pubblica 384 bits, ma lo stato della funzione di compressione sottostante è 512 bits perché SHA-384 è basato su SHA-512. Il digest rivela solo 384 di questi 512 bits, lasciando 128 bits sconosciuto a un utente malintenzionato. Questa è una proprietà di progettazione intenzionale di SHA-384 che fornisce questa resistenza.
Le costruzioni supportate SHA-1, SHA-256 e SHA-512 espongono lo stato completo; Il troncamento SHA-384 modifica il limite dell'estensione
La soluzione per l'autenticazione dei messaggi con un segreto condiviso è HMAC, il codice di autenticazione del messaggio con hash con chiave. HMAC non antepone il segreto e l'hash; applica invece il segreto in due operazioni hash nidificate utilizzando schemi di riempimento specifici chiamati pad interno ed esterno. La costruzione è HMAC(segreto, messaggio) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, messaggio)). Questo approccio nidificato colma il divario nell'estensione della lunghezza perché anche se un utente malintenzionato dispone del digest dell'hash interno, non può continuare l'hashing senza il segreto.
Il motivo per mantenere separate le operazioni digest e HMAC è evitare l'errore comune di trattare le due in modo intercambiabile. Uno sviluppatore che apprende l'hashing tramite uno strumento che esegue entrambe le operazioni potrebbe dimenticare quale sta utilizzando quando scrive il codice. Mantenere separato il calcolo del digest rende la scelta esplicita e rafforza l'apprendimento che l'autenticazione necessita di HMAC o di firme. Il calcolatore di hash ToolAcre SHA etichetta chiaramente i digest semplici e la documentazione spiega che HMAC è un'operazione completamente diversa.
HMAC come soluzione: la costruzione nidificata che colma il divario e perché è la risposta standard
Un esempio concettuale di estensione della lunghezza funziona sul familiare vettore di test abc. L'elaborazione di SHA-256 sul testo ASCII abc produce il digest ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Supponiamo che questo digest sia il risultato di secret + abc hash con un segreto 5-byte, per un totale di 8 bytes di input. SHA-256 elabora l'input in blocchi di 64 byte, quindi il primo e unico blocco è stato riempito con la lunghezza del messaggio e altri byte di riempimento. Un utente malintenzionato vede il digest e vuole creare un messaggio che inizi con abc seguito da dati aggiuntivi.
Non possono aggiungere direttamente ad abc perché non conoscono l'esatto riempimento aggiunto all'interno dell'hash. Tuttavia, possono calcolare quale deve essere stato il messaggio completamente riempito: abc più il riempimento richiesto per un input di 8 byte in un blocco di 64 byte. Quindi aggiungono i dati aggiuntivi, calcolano il riempimento per la nuova lunghezza totale e eseguono l'hashing della combinazione trattando il digest osservato come lo stato iniziale. Il risultato è un digest SHA-256 valido che il server accetterà perché antepone il segreto e calcola lo stesso hash.
Esempio pratico: una procedura dettagliata concettuale sull'estensione di un messaggio firmato, senza un target attivo
Per prevenire questo attacco in un sistema reale, lo sviluppatore non dovrebbe provare a creare l'autenticazione da un semplice hash. HMAC è la risposta standard e il calcolatore di hash ToolAcre SHA è uno strumento per calcolare semplici digest per controlli di integrità, hashing dei contenuti e scopi simili non di autenticazione. Esempi di usi sicuri dei semplici digest SHA-256 includono checksum di file, in cui un utente malintenzionato non può controllare sia il file che il digest; archiviazione indirizzabile al contenuto, dove l'hash è la chiave di ricerca; e firme digitali combinate con firme, dove la firma fornisce l'autenticazione.
L'intero ambito di questo problema include gli altri algoritmi forniti dal browser. SHA-1 è vulnerabile all'estensione della lunghezza ed era già crittograficamente danneggiato prima che diventasse rilevante. Il calcolatore ToolAcre etichetta SHA-1 solo come legacy e spiega gli attacchi di collisione che lo hanno reso inadatto per le nuove applicazioni. Per le nuove applicazioni, SHA-256 è la scelta sensata per i digest semplici e, se è necessaria l'autenticazione, HMAC con SHA-256 è la risposta. SHA-384 e SHA-512 sono entrambi vulnerabili, ma SHA-384 è protetto dal troncamento.
Ciò che questo non copre: il calcolatore ToolAcre calcola semplici digest, non HMAC; il post spiega perché questa distinzione è importante
Quando si costruisce il modello mentale delle funzioni hash, la costruzione Merkle-Damgård e l'estensione della lunghezza diventano i concetti chiave. Una funzione hash deve gestire lunghezze di input arbitrarie e produrre output fisso. Il modo in cui lo fa è concatenando una funzione di compressione blocco per blocco e il modo in cui lo stato finale viene convertito in output è estremamente importante. Se lo stato finale viene visualizzato interamente, l'output conterrà tutte le informazioni necessarie per continuare l'hashing. Se lo stato finale viene troncato, la parte viene nascosta.
Per uno sviluppatore che legge per la prima volta sugli attacchi con estensione della lunghezza, la domanda è come sapere se influisce sul suo caso d'uso. Se l'input dell'hash è una costante pubblica e l'hash viene utilizzato come chiave di ricerca o impronta digitale, l'estensione della lunghezza è irrilevante. Se l'hash viene utilizzato per autenticare un messaggio quando entrambe le parti condividono un segreto, l'estensione della lunghezza rappresenta una vulnerabilità critica e HMAC è la soluzione. Il calcolatore hash ToolAcre SHA visualizza digest e conteggi di byte, chiarendo che si tratta di output computazionali, non di meccanismi di autenticazione.
Conclusione: utilizzare MAC per l'autenticazione: il calcolatore hash ToolAcre SHA è per i digest di integrità; l'autenticazione richiede HMAC o una firma
Applicando questo ai sistemi di produzione, il principio è semplice: non utilizzare mai un semplice hash per l’autenticazione quando è coinvolto un segreto. HMAC è la costruzione standard che chiude completamente il vettore di attacco dell'estensione della lunghezza. SHA-256 e SHA-384 sono entrambi sicuri per gli scopi previsti se utilizzati correttamente. Comprendere i tre punti chiave (che Merkle–Damgård rivela il proprio stato nel digest, che SHA-384 tronca per nascondere parte dello stato e che HMAC utilizza una costruzione nidificata per impedire l'estensione) offre allo sviluppatore gli strumenti per fare la scelta giusta.
Il calcolatore di hash ToolAcre SHA incarna questo insegnamento: fornisce semplici riassunti per l'apprendimento e per usi legittimi non autenticati, etichetta SHA-1 come legacy e non implementa HMAC perché tale operazione appartiene a un contesto diverso. Quando gli sviluppatori utilizzano un semplice calcolatore di hash per autenticare una richiesta, il posizionamento e la documentazione dello strumento li guidano verso HMAC e le firme come strumenti adeguati. Il toolkit ToolAcre si concentra su ciò che fornisce direttamente Web Crypto del browser e spiega i limiti in cui ciascuna primitiva è appropriata.