Editar: eliminó una parte de la pregunta original; Lo desglosaré en otra publicación.
Estoy siguiendo @ Respuesta de Polynomial para almacenar información en una base de datos. Aquí están mis requisitos:
- Solo el usuario puede ver su información. El servidor solo ve datos revueltos.
- Permite cambios de contraseña fáciles
- Aceptar con "perdí tu contraseña, perdí tus datos"
- Si es posible, no almacena un hash de la contraseña de usuario
- Utilice solo un servidor y su propio espacio de almacenamiento
Esto es lo que tengo hasta ahora:
DB Table USER_DATA contiene ([clave XORed] [random IV] [datos secretos cifrados] [userID])
Entrada de datos
1. User enters (secret data) into a form.
2. User enters (user password)
3. Generate a strong (random key).
4. Encrypt (secret data) using (random key) and (random IV), as (encrypted secret data).
5. XOR hash of (random key) with hash of (user password) as (XORed key).
6. In the database, store in a new row: (XORed key),(random IV),(encrypted secret data), (userID)
Recuperar datos
1. Ask user for (user password).
2. Query database for (XORed key),(random IV),(encrypted secret data).
3. XOR hash (user password) with (XORed key) to retrieve the initial (random key)
4. Use (random key), (random IV) to decrypt (encrypted secret data).
5. Display decrypted data on screen.
Me gustaría solicitar comentarios sobre el sistema anterior, con respecto a su (1) seguridad y (2) eficiencia. También me gustaría conocer su opinión sobre el siguiente sistema:
Autenticación
La forma más simple sería almacenar un hash de la contraseña, autenticarse contra ella y crear una sesión para permitir la exploración de los registros. Cada registro se descifra y luego se muestra al usuario. Sin embargo, dado que la contraseña se utiliza para descifrar toda la información del usuario, estoy tratando de evitar almacenar su hash: Tengo curiosidad si es posible con un solo servidor involucrado . Aquí hay un sistema en el que pensé, pero romperlo requeriría exactamente el mismo esfuerzo de forzar brutalmente un hash:
Inicio de sesión inicial del usuario
1. Ask user for (user password)
1. Create a strong (random key)
2. XOR (user password) with (random key) into (XORed key).
Store this value in the database.
3. Create a (random hash). Store in database.
4. Encrypt (random hash) with (random key) and (random IV)
as (Encrypted random hash). Store in database.
Así que ahora tenemos en la base de datos: Tabla USER_AUTH ([clave XORed] [hash aleatorio] [hash aleatorio cifrado] [random IV])
En los inicios de sesión posteriores, la contraseña que proporciona el usuario está XORed con (clave XORed) para recuperar (clave aleatoria). (clave aleatoria) se utiliza para descifrar (hash aleatorio cifrado). Si el valor descifrado es el mismo que (hash aleatorio), la contraseña es correcta.