Ok, visión general básica del entorno que estoy imaginando: Webapp w / db backend que almacena datos confidenciales, posiblemente phi; usuario estándar: pasa la autenticación debido a usuarios imposibles de aprender.
Mi idea fue cifrar los datos de las filas en tablas confidenciales almacenadas en una base de datos utilizando una clave derivada de la contraseña del usuario (es decir, el hash pw utilizando un algoritmo diferente al de cómo se almacena la pw en db: por ejemplo, store for auth : pez globo (pw), cifrar w / clave = md5 (pw)). De esa manera, podría almacenar la clave de cifrado en la sesión (para permitir que los usuarios autenticados accedan a sus registros sin volver a ingresar a pw) sin aumentar el riesgo de fugas de pw y podría destruir w / sesión y regenerarse al iniciar sesión.
Beneficios:
- Me parece que un atacante no podría usar los datos si los robó mientras estaba "en reposo", es decir, la aplicación se apagó o se realizó una copia de seguridad.
Inconvenientes que ya puedo ver:
- Si olvida su contraseña, perderá todos sus datos.
- Se vuelve imposible editar los contenidos de la base de datos manualmente, todo debe ser autenticado con el pw utilizado para generar la clave de cifrado.
- No protege los datos mientras existe una sesión.
Lo que realmente me gustaría saber:
- ¿Me estoy perdiendo algún defecto fatal en mi esquema?
- ¿Existe una mejor manera de almacenar la clave de cifrado mientras la sesión está activa?
Aclaración:
Ok, creo que no estaba claro en mi redacción original de la pregunta. Quise decir que almacenaría un hash criptográficamente seguro de la contraseña (probablemente usando blowfish) para la autenticación, lo que significa que una colisión o fuerza bruta de la contraseña no será fácil (a menos que alguien rompa el blowfish, lo que siempre es un riesgo). Simultáneamente a la autenticación (cuando alguien ingresa su contraseña de todos modos), pateo la contraseña usando algún otro algoritmo (probablemente algo como md5, ya que no creo que deba ser criptográficamente seguro en este punto) que luego se almacenaría en la sesión y se utiliza para cifrar / descifrar las filas que pertenecen al usuario autenticado durante la sesión.
Mis pensamientos en relación con una mayor superficie de ataque son, por lo tanto:
- Si un atacante compromete el hash de la contraseña utilizada para la autenticación, simplemente puede iniciar sesión en la aplicación normalmente y extraer los datos de esa manera.
- Si un atacante compromete el cifrado de los datos de la base de datos, tiene todo en ese punto y no tiene sentido obtener la contraseña. Sin embargo, si pudieran extraer la clave de cifrado y, por algún motivo, querían iniciar sesión en la aplicación, no se beneficiarían de los ataques de colisión en md5 porque ese no es el hash utilizado para almacenar / autenticar la contraseña. Y una colisión contra un hash está básicamente garantizada para no ser una colisión contra otro algoritmo de hashing diferente.
Posible remediación de debajo vulnera:
- genere una buena clave criptográfica pseudoaleatoria antes de que se almacene cualquier información
- cifrar la clave criptográfica con la contraseña (no necesito transformar la contraseña para esta versión, no lo creo)
- en clave de descifrado de inicio de sesión y clave de almacenamiento en sesión
- use la clave para realizar el cifrado / descifrado en el resto de los datos
por qué creo que esto podría funcionar es que no se puede diferenciar el texto en claro del descuido descifrado incorrectamente, por lo que se pierde la capacidad de verificar si su suposición fue correcta, incluso si tiene una lista de posibilidades probables que no puede decir si alguna funcionó . Además, no obtiene ayuda bruta forzando la clave de cifrado porque ahora es un valor aleatorio adecuado.