Hash Crittografico

Indice dei contenuti

    Una funzione hash crittografica è una funzione matematica HH che mappa un input di lunghezza arbitraria in un output di lunghezza fissa detto digest (o impronta digitale):

    H:{0,1}{0,1}nH: \{0,1\}^* \to \{0,1\}^n

    La funzione è deterministica: lo stesso input produce sempre lo stesso digest. È progettata per essere one-way: dato il digest, è computazionalmente impossibile risalire all’input. Si distingue da un semplice checksum (CRC32, MD5 non crittografico) per tre proprietà di sicurezza formali che rendono impossibili specifiche classi di attacchi.

    Le tre proprietà crittografiche

    La pre-image resistance (unidirezionalità) garantisce che dato un digest hh sia impossibile trovare un input mm tale che H(m)=hH(m) = h. Fonda la sicurezza dell’archiviazione degli hash delle password: anche con il database in mano, l’attaccante non può risalire alle password originali.

    La second pre-image resistance garantisce che dato un input m1m_1 sia impossibile trovare un m2m1m_2 \neq m_1 con lo stesso digest. Impedisce che un attaccante sostituisca un documento firmato con uno diverso avente la stessa impronta.

    La collision resistance garantisce che sia impossibile trovare una qualsiasi coppia (m1,m2)(m_1, m_2) con m1m2m_1 \neq m_2 e H(m1)=H(m2)H(m_1) = H(m_2). Per il paradosso del compleanno, trovare collisioni richiede 2n/2\approx 2^{n/2} operazioni — per SHA-256 equivale a 21282^{128}, ancora irraggiungibile.

    Algoritmi

    SHA-256 e SHA-512 (famiglia SHA-2, costruzione Merkle-Damgård) sono lo standard universale corrente. SHA-3 (Keccak, costruzione sponge) è l’alternativa strutturalmente diversa standardizzata dal NIST nel 2015, immune all’attacco length extension che affligge Merkle-Damgård. MD5 e SHA-1 sono crittograficamente rotti — le loro collisioni si calcolano in secondi su hardware comune — e non devono essere usati per scopi crittografici.

    Applicazioni

    Le funzioni hash sono primitive trasversali a tutta la sicurezza informatica. Nell’archiviazione delle password si usano funzioni di derivazione lente con salt (Argon2id, bcrypt) che introducono un costo computazionale intenzionalmente alto per rendere il brute force impraticabile. Nell’HMAC (Hash-based Message Authentication Code) la hash viene combinata con una chiave segreta per garantire simultaneamente integrità e autenticità. Nelle firme digitali il firmatario calcola H(m)H(m) e lo cifra con la propria chiave privata: la verifica confronta il digest decifrato con H(m)H(m) ricalcolato. Negli alberi di Merkle ogni nodo interno contiene l’hash dei propri figli: permettono la verifica dell’appartenenza di un elemento a un insieme con soli O(logn)O(\log n) hash, base tecnica di Bitcoin, Git e dei sistemi di file distribuiti.

    Ultimo aggiornamento: