Pregunta

La red System.Security.Cryptography El espacio de nombres tiene una colección bastante desconcertante de algoritmos que podría usar para cifrar los datos de las tarjetas de crédito.¿Cual es el mejor?

Claramente debe ser seguro para una cuerda relativamente corta.

EDITAR:Estoy en el Reino Unido, donde tengo entendido que podemos almacenar datos de tarjetas de crédito cifrados siempre que nunca se almacene el número CVV de tres dígitos.Y gracias a todos por las excelentes respuestas.

¿Fue útil?

Solución

No te ofendas, pero la pregunta está un poco "equivocada".No existe una solución milagrosa.Recomendaría leer sobre criptografía en general y luego hacer algunos modelos de amenazas.Algunas preguntas (de ninguna manera una lista completa) que debes hacerte:

  • ¿Es el módulo que realiza el cifrado el que necesita descifrarlo (en este caso use cifrado simétrico) o enviará datos a otro módulo (en otra máquina) que los usará (en cuyo caso debe considerar la clave pública? cripto)
  • ¿Contra qué quieres protegerte?¿Alguien accede a la base de datos pero no tiene el código fuente (en cuyo caso puede codificar la clave de cifrado directamente en la fuente)?¿Alguien husmeando su red local (debería considerar soluciones transparentes como IPSec)?¿Alguien está robando su servidor (puede suceder incluso en centros de datos, en cuyo caso se debe considerar el cifrado completo del disco)?
  • ¿Realmente necesitas conservar los datos?¿No puede pasarlo directamente al procesador de la tarjeta de crédito y borrarlo después de recibir la confirmación?¿No puedes almacenarlo localmente en el cliente en una cookie o Flash LSO?Si lo almacena en el cliente, asegúrese de cifrarlo en el lado del servidor antes de colocarlo en una cookie.Además, si utiliza cookies, asegúrese de que sean únicamente http.
  • ¿Es suficiente comparar la igualdad de los datos (es decir, los datos que me ha dado el cliente son los mismos datos que tengo yo)?Si es así, considere almacenar un hash del mismo.Debido a que los números de tarjetas de crédito son relativamente cortos y utilizan un conjunto reducido de símbolos, se debe generar una sal única para cada uno antes del hash.

Edición posterior:tenga en cuenta que los algoritmos de cifrado estándar de la misma categoría (por ejemplo, 3DES y AES, ambos cifrados de bloques simétricos) tienen una potencia comparable.La mayoría de los sistemas (comerciales) no están rotos porque alguien haya forzado su cifrado por fuerza bruta, sino porque su modelado de amenazas no era lo suficientemente detallado (o simplemente no tenían ninguno).Por ejemplo, puede cifrar todos los datos, pero si tiene una interfaz web pública que es vulnerable a la inyección SQL, no le ayudará mucho.

Otros consejos

No importa.

Los números completos de la tarjeta nunca deben tocar el disco.

Lo único que importa es el código de autenticación.

Para seguimientos, etc., solo utilizará los últimos 4 dígitos xxxx xxxx xxxx 1234 y la fecha de caducidad.

Si va a almacenar números de tarjetas, la elección de criptografía la exigirá el banco adquirente.

A menos que usted sea el adquirente, en cuyo caso debería haber un viejo programador de Unix/db2 al que debería preguntarle.

"¿No puedes almacenarlo localmente en el cliente en una cookie?" <-- NUNCA

Yo añadiría a la opinión que simplemente no deberías almacenarlos a menos que tengas una muy buena razón para hacerlo, y almacenarlos en una cookie es una en realidad mala idea - son solo demasiado fácil conseguir (qué sucede si alguien roba una cookie; entonces no importará qué tan cifrada esté).

Si necesita realizar pagos repetidos, la mayoría de los proveedores de CC ofrecerán una forma de hacerlo almacenando algún tipo de token del pago inicial, sin conservar el número de tarjeta (puede conservar los últimos 4 dígitos para mostrárselos al cliente). para que sepan qué tarjeta está almacenada).

De verdad, ¡simplemente no lo hagas!

Además, nunca jamás debes conservar el código CCV.

según PCI DSS normas de cumplimiento, cualquier estándar de cifrado líder en la industria es suficiente.Por lo tanto, un 3DES con una clave de 256 bits es suficiente (aunque se pueden usar otros estándares).Mira esto http://pcianswers.com/2006/08/09/methods-of-encrypting-data/

No te olvides de la integridad aquí.Hay ataques de falsificación contra criptomonedas listas para usar cuando el atacante no conoce la clave, pero puede manipular el texto cifrado.Estos pueden ser particularmente desagradables cuando:

  • cifrar cadenas cortas,
  • con subcadenas conocidas

Ese es exactamente el caso de las tarjetas de crédito.Por lo tanto, usar System.Security.Cryptography AES o 3DES en modo CBC sin realizar su propia suma de verificación puede ser peligroso.Leer:Existe la posibilidad de que un atacante sin la clave secreta pueda reemplazar un número de tarjeta de crédito por otro.

Si está utilizando una pasarela de pago de terceros, no necesita almacenar los números.

No tiene sentido.

3des es bastante bueno, almacena el salt junto y guarda una clave estándar en algún lugar que no esté en la base de datos o en un archivo de configuración.De esa manera, si te engañan, no podrán descifrarlo.

También hay que considerar el aspecto legal.No conozco la situación en otros lugares, pero en Alemania simplemente no se permite almacenar números de tarjetas de crédito.1). Período. No importa si los cifra o no y en qué formato los almacena.

todos ustedes puede Lo que se debe hacer (y aquí me refiero de memoria, sin ningún conocimiento judicial) es almacenar un hash seguro (¿SHA-256?) del número de la tarjeta de crédito, junto con los últimos cuatro dígitos y el número de cuenta.Y sí, es trivial reconstruir el número completo sólo a partir de esta información.Las leyes no siempre son lógicas.


1) Excepto si es un instituto de tarjetas de crédito certificado a nivel federal.

Pista: Deberías investigar si es legal almacenar números de tarjetas de crédito.En Suecia, por ejemplo, tendrás que estar certificado por PCI (industria de tarjetas de pago), donde se pondrá a prueba su seguridad interna y externa (y muchas otras cosas).

Debería pensar en ambas cosas una o dos veces antes de almacenar la información de la tarjeta de crédito, ya que los costos legales de hacerlo mal pueden ser elevados.

Cifre la tarjeta de crédito con una clave pública.Proporcione la clave privada únicamente a la máquina procesadora de pagos.La máquina procesadora de pagos puede entonces consultar la base de datos y hacer el trabajo, y nadie más, ni siquiera la máquina que agregó la entrada, podrá descifrarla.

Algo así como openssl_seal de PHP, aunque si lo desea, quizás con un algoritmo diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top