PHP y MySQL encriptan los datos que necesito para descifrar en algún momento

3

Tengo una aplicación donde un usuario compra "alfileres de tarjetas de regalo". Una vez que hayan completado su compra, nosotros, como intermediarios, compramos los pines de un tercero y debemos entregarlos al usuario final.

Una vez que tengamos los pines, debemos subirlos para que el usuario pueda utilizarlos como una tarjeta normal. Debido a la necesidad de que estos datos sean confidenciales, pero al mismo tiempo, los datos que finalmente deben mostrarse al usuario final, tengo un mejor enfoque aquí.

Necesito almacenar estos códigos de manera segura, pero al mismo tiempo, poder decodificarlos cuando el usuario final necesite ver el código para el usuario en el sitio web del comerciante XYZ.

La aplicación utiliza el marco CodeIgniter de PHP que tiene una biblioteca de cifrado integrada.

Ejemplo:

$this->encryption->encrypt($data['Pin']) .

El pin se encripta y almacena en la base de datos MySQL y se puede recuperar con:

$this->encryption->decrypt($pin) .

El problema con esto, desde un punto de vista de seguridad, es que la aplicación PHP tiene almacenada la clave de cifrado para que pueda ejecutar estos métodos.

No creo que pueda usar el hash en esta situación, ya que necesito saber el verdadero valor de los datos.

¿Alguna sugerencia sobre un enfoque para esto?

    
pregunta SBB 08.01.2018 - 20:52
fuente

2 respuestas

2

El propósito de su aplicación es almacenar un secreto y revelarlo a un usuario autorizado en el momento adecuado. Esto no funciona sin poder descifrar dicho secreto. Me temo que cualquier solución en la que su organización no pueda acceder al secreto no va a funcionar. Por lo tanto, la única práctica de seguridad que lo protegerá del peor de los casos es la obvia: "No tiene ningún agujero de seguridad en su aplicación".

Sin embargo, el cifrado de datos en reposo en la base de datos aún puede tener sentido si desea compartimentar el conocimiento de los diferentes departamentos de su empresa.

Por ejemplo, si solo el administrador del servidor de aplicaciones tiene acceso a las claves de descifrado utilizadas en el entorno de producción, puede otorgar a los administradores y desarrolladores de la base de datos acceso de lectura a la base de datos de producción sin tener que preocuparse de que roben ningún pin. La mayoría de los problemas del día a día se podrán resolver sin requerir los pines en texto sin cifrar. Solo tenga en cuenta que todavía habrá situaciones en las que, para solucionar un problema, alguien debe descifrar un pin en la base de datos de producción. Así que asegúrese de que sus procesos permitan una excepción para estas situaciones.

Esto, por supuesto, solo se aplica si su organización es lo suficientemente grande como para que dicha compartimentación tenga sentido. Cuando usted es una pequeña empresa en la que DBA, el administrador del servidor, el desarrollador y el administrador de seguridad son la misma persona, todo esto no tiene sentido.

También puede ayudar en aquellas situaciones en que personas no autorizadas obtengan acceso de lectura a su base de datos (por ejemplo, a través de una inyección de SQL o una configuración incorrecta del servidor de la base de datos), pero no a la configuración del servidor donde se almacena la clave de descifrado. Pero recuerde que esto es solo un subconjunto limitado de posibles escenarios de ataque.

Pero, en cualquier caso, tenga cuidado de no usar demasiado en su cifrado de datos en reposo. Cuanto más elegante sea tu solución, más errores tendrá. Y cuantos más errores tenga, más situaciones tendrá donde las personas se vean obligadas a mirar los datos descifrados para corregir dichos errores.

    
respondido por el Philipp 08.01.2018 - 21:24
fuente
0

Es posible que desee buscar soluciones para manejar el proceso de cifrado y descifrado fuera de la lógica principal de la aplicación.

Puede intentar incorporar un HSM o (SaaS HSM, como AWS CloudHSM ) para realizar procesos de cifrado y descifrado para usted, esto reduciría las variables de seguridad codificadas en su código y dificultaría la manipulación incluso por personas de su organización.

Dependiendo de sus necesidades, también puede intentar con un administrador de secretos, como hashicorp-vault , o una herramienta de administración de identidad privilegiada , como servidor secreto de thycotic . Estas herramientas pueden hacer cosas como la rotación de contraseñas, pistas de auditoría, etc.

Desde su OP, no estoy 100% seguro de su lógica, pero parece que quizás desee asignar el código al usuario en el momento de la compra. Si este es el caso, puede reducir la exposición asignando al usuario una reserva para un código y luego retirándolo solo cuando lo solicite y hacerlo "una sola vez" -eg, deben escribirlo o nunca podrán obtener Una vez más, o al menos solo lo expones al usuario después de que en realidad primero dicen que necesitan canjearlo.

Nuevamente, aquí el uso de un HSM puede ser útil para mantener segura la lista de códigos PIN hasta que se asignen o se usen para administrar la asignación.

Idealmente, cada usuario tendría un par de llaves público-privado y usted podría simplemente cifrar el valor para que solo el usuario específico pueda descifrarlo. Sin embargo, esto es bastante difícil para hacerlo en una aplicación web .

Piense en una configuración similar a algo como LastPass que almacena las contraseñas de las personas , pero LastPass no no se limite a tener una gran base de datos de texto simple con las contraseñas almacenadas de las personas.

También puede interesarle echar un vistazo a MIT Mylar y cómo trata la protección y la administración de datos confidenciales. .

Echa un vistazo:

También considere que debe pensar cuando obtenga la lista de tarjetas y pines de su proveedor. Necesitará tener este archivo protegido y luego podrá tener archivos intermedios de este proceso. es decir, observe dónde se pueden exponer los datos en su camino hacia la aplicación / db, ya que podría haber otros lugares donde puedan estar expuestos.

    
respondido por el Eric G 08.01.2018 - 22:45
fuente

Lea otras preguntas en las etiquetas