SHA-256 (Secure Hash Algorithm 256-bit) è una funzione hash crittografica della famiglia SHA-2, progettata dalla NSA e standardizzata dal NIST nel 2001 (FIPS 180-4). Produce un digest di 256 bit (32 byte), tipicamente rappresentato come stringa esadecimale di 64 caratteri. È lo standard di fatto per l’integrità dei dati, le firme digitali, i certificati TLS e il Proof of Work di Bitcoin.
Costruzione Merkle-Damgård
SHA-256 è costruito secondo lo schema Merkle-Damgård: il messaggio viene suddiviso in blocchi da 512 bit con padding, e una funzione di compressione viene applicata iterativamente partendo da un valore iniziale fisso (IV):
La funzione di compressione esegue 64 round di operazioni su parole da 32 bit usando rotazioni, shift, XOR e addizioni modulari, con 64 costanti derivate dalle parti frazionarie delle radici cubiche dei primi 64 numeri primi.
Proprietà di sicurezza
SHA-256 soddisfa le tre proprietà fondamentali delle funzioni hash crittografiche: pre-image resistance ( operazioni per trovare un input dato il digest), second pre-image resistance () e collision resistance ( per il paradosso del compleanno — irraggiungibile con hardware attuale e futuro prevedibile). Nessuna vulnerabilità pratica è stata trovata in SHA-256, a differenza dei predecessori MD5 (rotto nel 2004) e SHA-1 (rotto con SHAttered nel 2017).
Vulnerabilità Length Extension
La costruzione Merkle-Damgård introduce la vulnerabilità length extension attack: conoscendo e la lunghezza di , è possibile calcolare senza conoscere . Per le API MAC questo è pericoloso: non usare SHA256(secret || message) come MAC, ma HMAC-SHA256 che è immune per costruzione.
Usi principali
SHA-256 è la primitiva più usata nell’ecosistema crittografico: firma digitale RSA-SHA256 e ECDSA-SHA256 nei certificati TLS, nell’HTTPS e nelle firme di aggiornamenti software; HMAC-SHA256 per l’autenticazione delle API; alberi di Merkle in Bitcoin (ogni blocco contiene SHA256 (SHA256 (header))), in Git (per i blob) e in Certificate Transparency; derivazione di chiavi con HKDF-SHA256 in TLS 1.3.
La famiglia SHA-2 comprende anche SHA-224, SHA-384 e SHA-512, con output e sicurezza crescenti. SHA-512 è preferibile su architetture a 64 bit dove è più veloce di SHA-256 per dati di grandi dimensioni.