me gustaría para permitir a los usuarios crear preguntas y recoger información de otros usuarios en una aplicación web personalizada (PHP/MySQL en un entorno de alojamiento apuntalado) y protegen los datos recogidos.
Antecedentes:
Las preguntas predeterminadas que todos los usuarios deberán responder son lo suficientemente que no pueden ser interpretados como información de identificación personal (PII) en general, lo que limita mi responsabilidad para protegerlo, pero los usuarios que crear su propia es probable que las preguntas soliciten PII, que luego se convierte en una responsabilidad.
Lo que me gustaría hacer es proteger esta información de manera que si la cuenta de hosting o la base de datos se veían comprometidas (¡o ambas cosas!), La PII no sería recuperable sin una cantidad significativa de trabajo, e incluso entonces, solo una pequeña porción sería teóricamente recuperable.
solución propuesta:
Asumiendo de MySQL incorporada AES_ENCRYPT()/AES_DECRYPT()
funciones se utilizan para cifrar la tabla de información de identificación personal, tendría que ser almacenada en la cuenta de alojamiento, por lo que si la cuenta de alojamiento se comprometió la frase de contraseña, los datos podría leerse fácilmente
Como las contraseñas de los usuarios están bien protegidas (mezcladas con sal), estoy pensando en capturar su contraseña de texto plano durante la autenticación, encriptarla y almacenarla en la sesión de PHP hasta que el usuario cierre la sesión.
Se creará un combo de clave pública/privada para cada usuario con la clave privada protegida por contraseña con la contraseña + contraseña del usuario.
Luego, cuando los datos PII basados en las preguntas personalizadas de ese usuario se agregan a la base de datos, la clave pública del usuario se usaría para encriptar la PII que recopilaron a través de la aplicación. Cuando se leen los datos (solo cuando el usuario está conectado), los datos se descifrarán con la clave privada del usuario (que se desbloquea con su contraseña + sal).
Los beneficios que veo son:
- en el peor de los casos, donde los servidores completamente comprometidos, código de aplicación se lee para encontrar las claves de cifrado, los archivos de sesión de PHP se descifran para encontrar las contraseñas de usuario, entonces entradas en la tabla de PII asociada con ese usuario se descifran, entonces solo se pudo recuperar la información de identificación personal recopilada de las preguntas de los usuarios que actualmente están conectados. Cualquier usuario que no haya iniciado sesión estaría seguro.
- incluso el DBA o similar no podría leer la PII.
Los inconvenientes veo son:.
- las contraseñas de usuario se almacenan en una forma recuperable mientras están conectados en
- usuarios que olvidan sus contraseñas podrían perder el acceso a sus datos.
- cada bit relativamente pequeño de datos ocupará mucho más espacio en la base de datos debido a la encriptación.
Mi pregunta es: ¿Existe alguna otra forma de hacerlo?
Es casi imposible garantizar la protección tan pronto como el servidor se vea comprometido. Tan pronto como alguien tiene acceso al código php, puede modificar fácilmente el código para escribir todas las contraseñas (o pares de claves) en un archivo de texto sin formato al iniciar sesión. Tan pronto como se conoce la sal (o se sabe cómo se construye), el hash no se guarda para protección. – Fge
Sí, mientras no se descubra la violación, se podrían capturar las contraseñas. La idea es contención y fuga minimizada. Al menos algunos datos aún estarían protegidos porque, con suerte, la brecha se descubriría con bastante rapidez y no todos los usuarios iniciarían sesión dentro de ese marco de tiempo. –
¿Qué es exactamente lo que quiere almacenar en la sesión de PHP? No veo por qué necesita una clave de cifrado adicional en la memoria si solo descifra la clave privada al iniciar sesión. –