Tengo algo de experiencia en la creación de sitios web basados en PHP con acceso a MySQL, el almacenamiento de datos cifrados del usuario, pero todos los demás campos son texto sin formato. Mi proyecto más reciente requerirá que se almacenen datos confidenciales en la base de datos.
Quiero configurar un sistema en el que un usuario pueda acceder a sus propias entradas y ver los resultados en texto sin formato, pero incluso si pudiera acceder a los de otra persona, serían cadenas encriptadas e ininteligibles.
Tengo una idea de cómo lograr esto, pero quizás no sea óptimo o ya existen herramientas para hacerlo de una manera más eficiente.
1.) Almacene el nombre de usuario como texto sin formato, y la contraseña con hash con sha1 () o mejor algoritmo de hash más sal aleatoria, etc.
2.) Tome la contraseña del usuario (no la que tiene el hash, sino la que escribió) y úsela para definir una clave específica para ese nombre de usuario y contraseña, que luego se almacenará como una variable de sesión. Ya que la clave nunca se almacena en ninguna parte, excepto en la cabeza del usuario (en la forma de que sepa su contraseña de texto simple, que luego se convertirá en una clave de alguna manera, mezclándola con su nombre de usuario y algo de sal, hashing, etc.). Para iniciar sesión, esta debería ser una buena solución, ¿no?
3.) Cifre o descifre todos los datos de ese usuario con esa clave.
En mi opinión, aunque alguien haya accedido a la base de datos y haya visto una lista de nombres de usuario de texto sin formato y contraseñas cifradas, no pudo descubrir la clave específica ya que no está almacenada en ningún lugar. Por lo tanto, incluso si se obtuvo acceso, no pudieron descifrar el contenido de los campos de base de datos confidenciales. Por supuesto, estoy desarrollando formas para evitar que accedan a la base de datos de todos modos, pero como un esfuerzo general, esto parece ser un buen conjunto de pasos.
¿Podrían los expertos comentar sobre esto y ofrecer algún consejo? Muchas gracias.
Publiqué esto en el foro programmers.SE y me aconsejaron que esta era una mejor ubicación para la pregunta. Más específicamente por qué no debería hacerlo yo mismo. Si es así, ¿qué alternativas hay?