Estoy trabajando para una compañía que está generando códigos de tarjetas de regalo que se pueden usar para pagar productos en tiendas en línea.
Me pregunto cuál es la forma más segura de generar estos códigos de tarjetas de regalo. La longitud debe ser de 16 caracteres (aunque eso es negociable) y puede ser alfanumérica (aunque numérica sería más amigable para el cliente).
Por lo que puedo ver, la forma más segura de hacerlo es generar un código de tarjeta de regalo de una longitud específica con el siguiente código de 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();
}
Esto se ha tomado de la respuesta de desbordamiento de pila aquí . Quité las letras minúsculas de la cadena para hacerlas más fáciles de usar. Así que esto produce 36 ^ 16
combinaciones. Numérico solo sería 10 ^ 16
combinaciones. Creo que solo con el número sería suficiente, pero a menudo se enfatiza que, dada la creciente prevalencia del fraude con tarjetas de regalo, la cadena debe ser alfanumérica. Así que esa es la pregunta uno: ¿numérico o alfanumérico?
Cuando los usuarios usan las tarjetas de regalo en una tienda en línea para pagar bienes, se realiza una llamada a nuestra API que devuelve el saldo y la moneda de esa tarjeta de regalo. Dado que los códigos de las tarjetas de regalo se ingresan en servidores de terceros, estas tarjetas de regalo ahora están disponibles para las personas que tienen acceso a esos servidores. Obviamente, esto es un problema en el caso en que aún queda un saldo después de que un usuario haya canjeado parcialmente uno.
Una opción sería, cuando la llamada a nuestra API se realiza (con el código de la tarjeta de regalo) para obtener el saldo, devolvemos y guardamos en su tienda una cadena aleatoria que solo la tienda en línea puede usar cuando nos están facturando, lo igualaremos con el código de la tarjeta de regalo en nuestro sistema. El problema con eso es, presumiblemente, el código de la tarjeta de regalo que el usuario ingresa en el proceso de registro se registra en algún lugar de sus registros y es accesible para cualquier persona que tenga acceso a esos registros.
Otra opción es que renovemos el código de la tarjeta de regalo una vez que se haya canjeado parcialmente. Por lo tanto, el usuario obtiene esencialmente un nuevo código de tarjeta de regalo para el saldo y el anterior se cancela. Este es probablemente el más seguro, pero no tan fácil de usar. Entonces, esa es la segunda pregunta: ¿Cómo aseguramos los códigos de las tarjetas de regalo que solo se canjean parcialmente y aún tienen valor en ellos?
EDIT:
También tenemos una página de Verificación de saldo en la que un usuario ingresa un código de tarjeta de regalo y la moneda y el saldo se devuelven. Esto presumiblemente crea algunas preocupaciones de seguridad adicionales.