Su una carta di credito, normalmente troverai:
- il numero , in genere 16 cifre;
- la data di scadenza (mese e anno, di solito entro i prossimi due anni);
- il nome del titolare della carta;
- il codice di sicurezza (3 o 4 cifre).
Il problema con gli hash di pubblicazione di tali informazioni è la vulnerabilità alla ricerca esaustiva: l'utente malintenzionato tenta tutte le possibili combinazioni finché non si trova il valore hash. Esistono due modi per sconfiggere tali attacchi: mantenendo un numero elevato di combinazioni e rendendo lento il processo di hashing.
Rallentare l'hash richiede l'uso di un salt (per prevenire attacchi paralleli e precomputazioni) e fare molte iterazioni nidificate (il più possibile, a condizione che l'overhead sia tollerabile per il tuo sistema). C'è un'arte in questo; una costruzione incurante fatta a mano può essere piuttosto debole. Questa parte è molto simile a ciò che viene fatto per le password, quindi riduciamola al solito consiglio: usa bcrypt . Una buona GPU può valutare una funzione di hash a 32 bit come SHA-1 circa un miliardo di volte al secondo; ma configurando il "fattore costo" di bcrypt è possibile riportare una cifra del genere, ad esempio, 100 volte al secondo, senza sovraccaricare troppo il proprio sistema.
Ora vediamo il numero di combinazioni. Il nome del titolare della carta può essere spesso indovinato, perché in un database di un sito commerciale si registra anche il nome utente e, eventualmente, un indirizzo di consegna. La data di scadenza è entro i prossimi due anni (o giù di lì), quindi 24 possibilità. Il numero della carta di solito inizia con un identificatore di 4 cifre per il banco e termina con una cifra di checksum calcolata in modo deterministico dagli altri 15. Supponendo che l'attaccante proverà, ad esempio, su dieci distinti banchi, si ottengono circa 10 11 (ovvero "cento miliardi") possibili numeri di carte. Tuttavia , se il "numero della carta troncata" contiene, ad esempio, 8 cifre (la prima e l'ultima di quattro cifre), tale numero viene ridotto a 10 8 (cento milioni) .
Se usi bcrypt e attack puoi andare solo ad una velocità di 100 tentativi al secondo, allora l'attaccante avrà bisogno di una media di mezzo milione di secondi per trovare il numero della carta (che è circa 6 giorni ). Questo può essere visto come "sufficiente" perché il valore di rivendita di un numero di carta di credito rubato non è elevato (penso che sia di circa 10 $ al massimo). Per aumentare la resilienza, non eseguire l'hash del numero solo, aggiungere la data di scadenza (x24 in costo di attacco) e il codice di sicurezza (x1000).
Quindi, per riassumere:
- usa bcrypt con un conteggio ad alta iterazione (e non armeggiare con il sale);
- inserisci la data di scadenza e il codice di sicurezza nell'input dell'hash;
e puoi resistere all'indebolimento indotto dalla memorizzazione dei dati troncati della carta.