Do no un simple almacén de SHA-1 del número de tarjeta de crédito, sería manera a fácil de descifrar (especialmente desde que se conocen los últimos 4 dígitos). Tuvimos el mismo problema en mi empresa: así es como lo resolvimos.
Primera solución
- Para cada tarjeta de crédito, almacenamos los últimos 4 dígitos, la fecha de caducidad, una sal aleatoria de longitud (longitud de 50 bytes), y el hash con sal del número de CC. Usamos el algoritmo hash bcrypt porque es muy seguro y se puede sintonizar para que consuma tanto CPU como lo desee. Lo sintonizamos para que sea muy caro (¡aproximadamente 1 segundo por hash en nuestro servidor!). Pero supongo que podrías usar SHA-256 e iterar tantas veces como sea necesario.
- Cuando se ingresa un nuevo número CC, comenzamos por encontrar todos los números CC existentes que terminan con los mismos 4 dígitos y tienen la misma fecha de vencimiento. Luego, para cada CC coincidente, verificamos si su hash salado almacenado coincide con el hash salado calculado a partir de su sal y el nuevo número CC. En otras palabras, verificamos si
hash(stored_CC1_salt+CC2)==stored_CC1_hash
o no.
Dado que tenemos aproximadamente 100k tarjetas de crédito en nuestra base de datos, tenemos que calcular aproximadamente 10 hashes, por lo que obtenemos el resultado en aproximadamente 10 segundos. En nuestro caso, esto está bien, pero es posible que desee ajustar bcrypt un poco. Lamentablemente, si lo hace, esta solución será menos segura. Por otro lado, si sintoniza bcrypt para que consuma más CPU, tardará más tiempo en coincidir con los números CC.
Aunque creo que esta solución es manera mejor que simplemente almacenar un hash sin sal del número de CC, no va a impedir que un pirata muy motivado (que logra obtener una copia de la base de datos) para romper un crédito tarjeta en un tiempo promedio de 2 a 5 años. Entonces, si tiene 100k tarjetas de crédito en su base de datos, y si el pirata tiene un lote de CPU, ¡entonces puede recuperar algunos números de tarjetas de crédito todos los días!
Esto me lleva a la creencia de que no debe calcular el hash usted mismo: tiene que delegar eso a otra persona. Esta es la segunda solución (estamos en el proceso de migrar a esta segunda solución).
segunda solución
simplemente tienen su proveedor de pago genera un alias para su tarjeta de crédito.
- para cada tarjeta de crédito, sólo tiene que almacenar todo lo que desea almacenar (por ejemplo, los últimos 4 dígitos & la fecha de vencimiento) más un número de tarjeta de crédito alias.
- cuando se ingresa un nuevo número de tarjeta de crédito, contacta a tu proveedor de pagos y dale el número CC (o redirigir al cliente al proveedor de pagos, e ingresa el número CC directamente en el sitio web del proveedor de pagos). ¡A cambio, obtienes el alias de la tarjeta de crédito! Eso es. Por supuesto, debe asegurarse de que su proveedor de pago ofrezca esta opción y de que el alias generado sea realmente seguro (por ejemplo, asegúrese de que no calculen simplemente un SHA-1 en el número de tarjeta de crédito). Ahora el pirata tiene que romper su sistema más el sistema de su proveedor de pago si quiere recuperar los números de la tarjeta de crédito.
Es simple, es rápido, es seguro (bueno, al menos si su proveedor de pago es). El único problema que veo es que lo vincula con su proveedor de pagos.
Espero que esto ayude.
Estoy de acuerdo. Tenga en cuenta que esto hace que el registro de una tarjeta de crédito sea una operación O (n) donde n es el número existente de tarjetas registradas. Además, el hashing es una operación bastante costosa. – Johan