Cómo iniciar sesión y cifrar datos con la misma contraseña / clave

5

He creado una aplicación web de "bóveda" en PHP para almacenar contraseñas, números de tarjetas de crédito, etc. Es principalmente para mí, pero estoy practicando con múltiples usuarios en mente. Uso el cifrado bidireccional para proteger los datos, y quiero que el usuario inicie sesión con su clave (frente a una contraseña para iniciar sesión Y una clave para sus datos).

Inicialmente almacené el nombre de usuario en texto plano, y la clave / contraseña de una manera cifrada con un salt. Mi primera preocupación es que si alguien tuviera acceso a los datos de SQL, probablemente tendrían acceso a mi código (mi método de encriptación y sal) haciendo más corto el trabajo de revelar la contraseña, y luego poder acceder a los datos cifrados de dos maneras con ella .

Tampoco me gustó el nombre de usuario que se encuentra allí en texto sin formato ... es la mitad de la información de inicio de sesión.

Básicamente, me preocupa que el inicio de sesión proporcione información adicional sobre los datos cifrados en sí.

¿Cuál es la mejor práctica para iniciar sesión y el cifrado bidireccional de los datos con la misma contraseña / clave?

... y ¿alguien sabe dónde puedo aprender más sobre este concepto específico?

    
pregunta Joel Mellon 30.10.2012 - 18:42
fuente

3 respuestas

10

En primer lugar, no te preocupes por el nombre de usuario. Se supone que el nombre de usuario es información pública. Si no lo fuera, no sería un nombre de usuario, sería una contraseña. Simplemente asuma que un atacante podrá averiguar el (los) nombre (s) de usuario en cualquier caso y diseñe su sistema para que esté seguro con esa suposición.

En segundo lugar, no te preocupes si el método de cifrado (o hashing, etc.) sea público, tampoco. Eso es principio de Kerckhoff : el método de encriptación debe tratarse como público, lo único que debe ser secreto debe ser el clave (o contraseña, en este caso).

Hay muchas buenas razones para esto, entre ellas el hecho de que le permite publicar cómo funciona el sistema (y, por lo tanto, convencer a sus usuarios de que es seguro, o pedir ayuda a expertos en seguridad, o simplemente usar un sistema estándar diseñado y analizado por dichos expertos) sin comprometer su seguridad.

En tercer lugar, no te preocupes por la salt tampoco. La sal también debe ser tratada como (potencialmente) conocimiento público. Su propósito no es proporcionar ningún secreto adicional, sino protegerse contra los ataques que utilizan tablas hash precompiladas asegurando que la contraseña de cada usuario se marque de forma diferente, incluso si las contraseñas reales son las mismas.

Bien, entonces, ¿qué debería hacer?

En primer lugar, debe usar una función de derivación de claves segura que implementa key estiramiento (y salazón, por supuesto) para derivar la clave de cifrado del usuario a partir de su contraseña. PBKDF2 debería hacerlo bien, aunque, por ejemplo, scrypt puede ser aún mejor si lo tiene disponible.

En segundo lugar, obviamente, no deberías no usar la clave de cifrado como el hash de la contraseña. De hecho, no debe almacenar nada en su base de datos que pueda usarse para obtener la clave de cifrado sin saber la contraseña. (Por ejemplo, la clave de cifrado no debe ser un hash del hash de la contraseña).

Una cosa que podría hacer es derivar la clave de cifrado y el hash de la contraseña por separado de la contraseña utilizando PBKDF2, pero eso sería un poco ineficiente, ya que PBKDF2 es deliberadamente lento. En su lugar, podría derivar la clave de cifrado de la contraseña con PBKDF2, y luego usar un hash criptográfico normal (por ejemplo, SHA-256) de la clave como el hash de la contraseña para iniciar sesión. (O, si desea tener más cuidado, obtenga tanto la clave de cifrado como el hash de contraseña de una clave intermedia derivada de la contraseña utilizando PBKDF2.)

Finalmente, para facilitar el cambio de contraseña, no encripta directamente los archivos con la clave de encriptación del usuario. En su lugar, para cada archivo, cree una clave de archivo aleatoria, cifre el archivo con la clave de archivo y cifre la clave de archivo con la clave de cifrado del usuario. De esa manera, cuando el usuario desea cambiar su contraseña, solo necesita volver a cifrar las claves de archivo.

    
respondido por el Ilmari Karonen 30.10.2012 - 23:05
fuente
2

La serie de blogs de Eric Lippert " You ¿Quieres Salt With That? "me ayudó a comprender varios problemas relacionados con la seguridad. Fue escrito en 2005, pero la información aún se mantiene hoy.

También puede consultar la Guía de autenticación de OWASP y su Hoja de trucos de autenticación

Esos documentos deberían resultar útiles, pero en lo que respecta a What is the best practice for logging in ... No creo que haya una respuesta directa y sencilla sobre eso. Tampoco soy un experto en seguridad, espero que alguien que sepa más esté dispuesto a intervenir y aconsejarte sobre eso.

    
respondido por el Anthony Hatzopoulos 30.10.2012 - 22:55
fuente
0

Uso la contraseña del usuario como base para la clave de cifrado, y la uso para cifrar una cadena codificada en json de los permisos del usuario y almacenarla junto con su nombre de usuario.

Al iniciar sesión, el nombre de usuario es el único campo que se busca en la base de datos.

Cuando se devuelve una fila coincidente, los datos cifrados salen de la base de datos y luego se descifran con la contraseña. Si esto es válido json, se decodifica y se usa, de lo contrario, la contraseña era incorrecta

EDIT

Además, podría agregar algunos datos aleatorios al json, como un salt, y volver a cifrarlos y actualizarlos en la base de datos para agregarle una variación de tiempo

    
respondido por el Chris Rutledge 05.01.2018 - 13:46
fuente

Lea otras preguntas en las etiquetas