cifrado bidireccional Php a la base de datos mysql [duplicar]

0

Me gustaría saber / saber cómo otras compañías enfrentan el problema de almacenar las claves de cifrado. Quiero cifrar la dirección de correo electrónico del usuario (y otra información confidencial) pero (porque quiero poder enviarle un correo electrónico al usuario) Necesito cifrado de dos maneras para descifrarlo.

Hice algunas investigaciones pero todavía no lo entiendo completamente. Es por eso que estoy por tu experiencia.

La pregunta, qué debe usar como clave de cifrado (como la contraseña con hash) o dónde / cómo debe almacenar una clave generada.

Sería inútil almacenar la clave en la misma base de datos porque si se compromete, la clave también se filtrará y los datos se podrán descifrar. Pero los datos deben ser accesibles por el programa ...

Así que estaba pensando ( y compartan su opinión / experiencia ) sobre una base de datos sqLite que vincula la cadena de caracteres de (bcrypt hashed password + mt_rand 64 bit of clave de cifrado de longitud variable) a un user_id. Solo se podrá acceder al archivo desde el código (o desde el exterior si nginx / linux está comprometido). Y si un usuario solicita datos que están cifrados, el sistema usará la identificación del usuario para buscar la clave de cifrado dentro de la base de datos sqlite y usar esa clave para descifrar los datos de la base de datos mysql.

Una mejor manera sería que ni siquiera yo pudiera acceder a los datos (como el hashing), sino que el sistema podría descifrarlos, pero no creo que eso sea posible.

nota al pie, aunque solucionaría este problema dejando la respuesta, también comparte recursos , no solo me ayudaría a resolver mi problema. Pero también aprendiendo a ser mejores en seguridad.

    
pregunta goosmaster 20.09.2017 - 17:00
fuente

1 respuesta

2

Lo que haces aquí depende de tu modelo de amenaza y contra qué escenario de ataque estás tratando de defenderte. Asumiré que está tratando de protegerse contra una situación en la que un atacante puede leer el contenido de la base de datos (por ejemplo, a través de una vulnerabilidad de inyección de SQL) pero no el contenido del sistema de archivos. También voy a asumir que te preocupas por la confidencialidad y no por la integridad o autenticidad.

Vale la pena señalar que tendrá que bloquear los permisos de los usuarios de la base de datos para evitar que una inyección de SQL obtenga acceso al sistema de archivos mediante comandos como LOAD DATA INFILE , de lo contrario, el acceso a la base de datos también implica el acceso al sistema de archivos en la mayoría de los casos.

La forma general de proteger el contenido de la base de datos contra tal escenario es tener una clave simétrica almacenada externamente en la base de datos, por ejemplo. En una variable de configuración o almacenada en su propio archivo. Luego, para cada elemento de datos que desea cifrar, genera un IV y encripta los datos con AES en modo CBC, luego almacena los datos IV y encriptados como columnas en la base de datos. Luego puede descifrar el valor encontrando la fila que desea descifrar, leyendo el IV y la dirección de correo electrónico cifrada, y luego descifre AES-CBC con la clave que cargó desde el archivo de claves.

Sin embargo, esto significa que no puede buscar en la tabla de usuarios por dirección de correo electrónico. Scott Arciszewski escribió una excelente publicación en el blog recientemente sobre construyendo bases de datos cifradas con capacidad de búsqueda que puede ayudarte si esto es un requisito.

    
respondido por el Polynomial 20.09.2017 - 17:16
fuente

Lea otras preguntas en las etiquetas