Sto lavorando per un'azienda che sta generando codici di carte regalo che possono essere utilizzati per pagare beni nei negozi online.
Mi chiedo quale sia il modo più sicuro per generare questi codici di carte regalo. La lunghezza deve essere di 16 caratteri (anche se è negoziabile) e può essere alfanumerica (anche se numerica sarebbe più adatta al cliente).
Da quello che posso vedere, il modo più sicuro per farlo è generare un codice di gift card di una lunghezza specifica con il seguente codice Java:
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static SecureRandom rnd = new SecureRandom();
String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
Viene preso dalla risposta Overflow dello stack qui . Ho rimosso le lettere minuscole dalla stringa per renderlo più facile da usare. Quindi questo produce combinazioni 36 ^ 16
. Solo numeri sarebbero combinazioni 10 ^ 16
. Credo che il solo numerico sarebbe sufficiente, ma è spesso sottolineato che, data la crescente diffusione della frode delle carte regalo, la stringa dovrebbe essere alfanumerica. Questa è la domanda 1: numerica o alfanumerica?
Quando gli utenti utilizzano le carte regalo in un negozio online per pagare i beni, viene effettuata una chiamata alla nostra API che restituisce il saldo e la valuta per quella carta regalo. Dato che i codici delle carte regalo sono inseriti su server di terze parti, queste carte regalo sono ora disponibili per le persone con accesso a quei server. Questo è ovviamente un problema nel caso in cui vi sia ancora un saldo residuo dopo che un utente ne ha parzialmente rimborsato uno.
Un'opzione sarebbe, quando la chiamata alla nostra API viene effettuata (con il codice della carta regalo) per ottenere il saldo, restituiamo e salviamo sul loro negozio una stringa casuale che può essere utilizzata solo dal negozio online quando ci stanno fatturando - lo abbineremo al codice della carta regalo sul nostro sistema. Il problema con questo è presumibilmente il codice della carta regalo che l'utente inserisce nel checkout viene registrato da qualche parte nei propri registri ed è accessibile a chiunque abbia accesso a tali registri.
Un'altra opzione è che aggiorniamo il codice della carta regalo dopo che è stato parzialmente riscattato. Quindi l'utente viene essenzialmente rilasciato con un nuovo codice della carta regalo per il saldo e il precedente viene annullato. Questo è probabilmente il più sicuro, ma non così facile da usare. Questa è la seconda domanda: in che modo vengono protetti i codici delle carte regalo che vengono riscattati solo in parte e hanno ancora un valore residuo?
Modifica
Abbiamo anche una pagina Verifica saldo in cui un utente inserisce un codice di carta regalo e la valuta e il saldo vengono restituiti. Ciò presumibilmente crea alcuni problemi di sicurezza aggiuntivi.