Esiste una categoria di attacchi sorprendente: non sfrutta un bug nel codice, ma il tempo che il sistema impiega a rispondere. Misurando i millisecondi, un attaccante può estrarre un segreto. Si chiamano timing attack, e si neutralizzano con un confronto "a tempo costante".
Cos'è un timing attack
Immagina che il sistema confronti un token carattere per carattere e si fermi al primo che non combacia. Più caratteri iniziali sono corretti, più tempo impiega. Misurando quei tempi, l'attaccante indovina il segreto un pezzo alla volta.
Perché il confronto "normale" è vulnerabile
Il confronto ingenuo (che si interrompe appena trova una differenza) "perde tempo" in modo misurabile e correlato al segreto. È proprio questa correlazione a essere sfruttabile.
Il confronto a tempo costante
La soluzione è confrontare i valori in un tempo che non dipende da quanto combaciano. In Node.js esiste una funzione apposita:
const crypto = require('crypto');
crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));
Il tempo è sempre lo stesso, quindi non rivela nulla.
Dove si applica
Ovunque si confronti un segreto: token di sessione, firme, chiavi API, codici di verifica. È un accorgimento piccolo ma che distingue il software fatto con cura.
Cosa significa per il tuo progetto
Significa che i tuoi segreti restano davvero segreti, anche di fronte ad attacchi sofisticati. È il tipo di attenzione che metto nei progetti che gestiscono dati sensibili. Contattami.
Collegato: hash delle password e rate limiting.