Descripción breve
Me pregunto si hay una forma de almacenar de forma segura una alternativa del número completo de la tarjeta de crédito, cuyo número de tarjeta no debe ser recuperado de la alternativa.
Descripción larga
Mi objetivo aquí es almacenar de alguna manera una alternativa del número completo de la tarjeta de crédito de los clientes en la base de datos para que podamos identificar al mismo cliente en su próxima compra. Sin embargo, debería ser un gran problema de seguridad si hash / ciframos el número completo en la base de datos. Por lo tanto, me refiero a la idea de una criptografía de relleno único en la que se usó el CC como clave privada (Clave) y la clave se usará para cifrar una cadena aleatoria que seguirá un patrón (Texto sin formato). Por lo tanto, Key
no se almacenará en la base de datos, y hay millones de posibilidades de Plain Text
.
Flujo exacto de la idea inicial
Número de tarjeta de prueba: 4539112781735373 (fuente: enlace )
A) Cifre el número completo de la tarjeta de crédito con bcrypt con un costo de 14 ( $2y$14$g161t43Dcu7beXbIn2a55.LvH.Cpn7pwu05MPCz1PbAzbFEr0SqZS
)
B) Convierta la salida de bcrypt a bytes ( 00100100 00110010 01111001 00100100 00110001 00110100 00100100 01100111 00110001 00110110 00110001 01110100 00110100 00110011 01000100 01100011 01110101 00110111 01100010 01100101 01011000 01100010 01001001 01101110 00110010 01100001 00110101 00110101 00101110 01001100 01110110 01001000 00101110 01000011 01110000 01101110 00110111 01110000 01110111 01110101 00110000 00110101 01001101 01010000 01000011 01111010 00110001 01010000 01100010 01000001 01111010 01100010 01000110 01000101 01110010 00110000 01010011 01110001 01011010 01010011
)
C) Genere 6 números aleatorios de 10 dígitos siguiendo un patrón como texto simple (el patrón debe ser lo suficientemente simple para dejar más posibilidades abiertas y complicar lo suficiente como para ser identificable, digamos que todos se pueden dividir entre 2 y 7 ) ( 1410065398 1410065384 1410065370 1410065356 1410065328 1410065342
) y convierte los números a bytes ( 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00111001 00111000 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00111000 00110100 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00110111 00110000 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00110101 00110110 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00110010 00111000 00110001 00110100 00110001 00110000 00110000 00110110 00110101 00110011 00110100 00110010
)
D) Realice XOR con bytes del paso B) y C), salida 101010000011001001000000101000000000100000010000100010101010000001000000011100000000001000000000001010000001101110100010101010100000000000100010110100101000101101001010101100111100001011110000000100101011100000000000001100001100101111100010001110111110000011111011100110100000001011000000000100100001101000010010000110000000100000001011111000110000001110011010011000000010001100011010100000111100101001011010101100111011101110101010000100000011001100110010000100110111001100001
E) Cuando se realice otra compra con la misma tarjeta de crédito, el paso B) se realizará nuevamente y los bytes de salida se usarán para comparar todos los registros del paso D) (independientemente del rendimiento)
F) Todos los bytes recuperados se convertirán de nuevo a números y verifique que se puedan dividir entre 2 y 7, los registros coincidentes se tratarán como un "cliente devuelto"
Lo que realmente me pregunto es ...
- ¿Es el flujo anterior lo suficientemente seguro como para proteger la tarjeta de los clientes? número?
- ¿Hay algún otro paso que pueda tomar para hacerlo más seguro?
- ¿Se podría aplicar algún algoritmo o patrón mejor para el paso C)?
- ¿Cuesta 14 lo suficientemente bueno para el paso A)? O es el costo / seguridad importa cuando se obtienen los bytes de la tarjeta de crédito?
- ¿Es posible descifrar el número completo de la tarjeta con el método anterior? Si es así, ¿cuánto tiempo lleva?
- ¿Cuál es la posibilidad de que 2 tarjetas de crédito diferentes choquen el método anterior? (mismo resultado)
Lo siento, no soy bueno en matemáticas, cifrado o seguridad, cualquier idea es bienvenida.
Comentario
Los primeros 6 y los últimos 4 dígitos del número de tarjeta se almacenan en la base de datos en otro lugar.