Spesso dobbiamo eliminare (smettere) le chiavi di accesso al database spesso, ma è importante sapere quale chiave sta usando ciascun sistema per evitare di rimuovere una chiave in uso creando così indisponibilità. Vogliamo che ogni sistema riferisca quale chiave sta utilizzando senza esporre la chiave stessa, naturalmente.
Utilizziamo chiavi generate in modo casuale con 512 bit di dimensione e abbiamo in programma di cancellare quelle chiavi e rendere disponibili gli hash in un supporto meno sicuro.
Ecco il dilemma: dovremmo usare un grande o un piccolo digest?
La dimensione minima del digest dovrebbe essere di 32 bit. Abbiamo solo bisogno di confrontare una manciata di chiavi ogni volta, quindi è ok avere 1- (1 / (2 ^ 32)) di fiducia (che dà più del 99,9999%). Anche un'eventuale collisione ritarda un poco le operazioni di smantellamento delle chiavi in collisione, quindi è innocuo.
Ovviamente se l'hacker vede l'hash, può filtrare tutte le chiavi che non producono lo stesso hash, riducendo lo spazio di ricerca a 2 ^ (512-32) o 2 ^ 480, che consideriamo abbastanza sicuro.
Tuttavia alcuni colleghi hanno suggerito che un piccolo digest è suscettibile alle tabelle arcobaleno e ad altri attacchi, quindi dovremmo usare un digest completo di SHA-256 o SHA-512. Mi sembra strano, perché se la nostra chiave stessa è 512 bit, allora un hash SHA-512 non genererebbe alcuna collisione e l'utente malintenzionato dovrebbe solo trovare la chiave che produce lo stesso hash. Tutta questa elaborazione può essere eseguita offline, senza accesso al database per testare le chiavi. Quindi sembra più pericoloso dell'utilizzo di un digest a 32 bit.
Come possiamo risolvere questo?