Almacenar contraseña usando sha1 [duplicar]

6

He estado usando la función sha1() para codificar la contraseña antes de insertarla en mi base de datos. Pero tengo este procedimiento para que no sea la contraseña que se va a hash.

Mi página registraría un usuario junto con su contraseña. Después del envío, ingresaría primero el nombre de usuario en la base de datos, luego obtendría la ID única de ese nombre de usuario. Luego el sistema lo combinará con la contraseña.

$password = $userid.$password;

Luego usa sha1() para hacer hash de la contraseña:

$password = sha1($password);

Luego actualice la contraseña en la base de datos con ese ID.

Utilicé el ID de usuario como una sal.

Pregunta

¿Es esta una buena técnica? Aunque los únicos usuarios del sistema son el otro departamento de nuestra empresa, creo que es suficiente para ellos en mi opinión.

¿Y si tengo un proyecto importante en el futuro que requiera una mejor seguridad de contraseña, será suficiente? Gracias!

    
pregunta Logan Wayne 11.05.2015 - 09:57
fuente

4 respuestas

15

No se debe generar una sal de otros parámetros conocidos, una sal debe ser única a nivel mundial. Entonces, lo mejor que puedes hacer es generar un sal realmente aleatorio para cada contraseña. Los sistemas operativos de hoy tienen una "fuente aleatoria", en una computadora determinista es lo mejor que puede hacer para leer esta fuente aleatoria (DEV_URANDOM).

Además de esto, la familia de hash SHA- * no es apropiada para las contraseñas de hash, porque estos algoritmos son demasiado rápidos y, por lo tanto, pueden forzarse con la fuerza bruta ( 3Giga SHA1 / s ). En su lugar, debe utilizar una función de derivación de clave lenta con un factor de costo, como BCrypt, PBKDF2 o SCrypt.

Para PHP, existe una función dedicada a las contraseñas de hash, está diseñada de manera que puede cambiar el algoritmo en el futuro si es necesario, pero aún puede verificar los hashes antiguos:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

// This way you can define a cost factor (by default 10). Increasing the
// cost factor by 1, doubles the needed time to calculate the hash value.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
    
respondido por el martinstoeckli 11.05.2015 - 10:29
fuente
6

Hay dos cosas mal con lo que estás haciendo con lo que estás haciendo:

  • su algoritmo en su forma simple es rápido y, por lo tanto, no es adecuado para el hashing de contraseñas. (Las propiedades que desea en un algoritmo de hash de contraseñas es que sea lo suficientemente rápido para ejecutarse una vez, pero lento si necesita ejecutarlo varias veces, además de ser hostil cuando se ejecuta en FPGA / ASIC o GPU.
  • Tu salazón es malo . Una sal debe ser globalmente única, lo que significa que debe tener un nivel de aleatoriedad tan poco común, que no exista la posibilidad de que haya ocurrido como sal antes en cualquier parte del mundo. Esto es para evitar ataques donde se han filtrado varias bases de datos, ya que es probable que los usuarios reutilicen su nombre de usuario. Por lo tanto, es una mala práctica usar un nombre de usuario como salt, ya que por qué puede ser único para su base de datos, no lo será para otra base de datos utilizando el mismo principio.

Actualmente hay tres algoritmos aceptados: bcrypt, scrypt y pbkdf2.

    
respondido por el Lucas Kauffman 11.05.2015 - 10:35
fuente
3

Un inconveniente de SHA1 es que es rápido, por lo que es más fácil crear tablas de arco iris y forzarlas. Agregar una sal ayuda, pero si la contraseña es débil, entonces "número + contraseña débil" puede estar en las tablas del arco iris junto con la contraseña.

PHP proporciona mecanismos de contraseña incorporados . Cuando los utiliza, la función crypt genera automáticamente un salt para usted que es almacenado con la contraseña con hash + sal .
Esta es la forma recomendada de usar hashes de contraseña (con sal) en PHP.

    
respondido por el S.L. Barth 11.05.2015 - 10:21
fuente
-1

Simplemente almacenar la contraseña usando sha1 / md5 o cualquier función de hashing no es una buena práctica. Muchos sitios proporcionan un diccionario para descifrar estas contraseñas.

La solución es usar un poderoso salt para agregar una contraseña, luego convertirla a hash sha1. Está utilizando un tipo de relleno muy básico o simple.

Puedes usar rand, marca de tiempo, hash doble como sal. En cuanto al rendimiento, le costará poco más, pero su aplicación estará protegida.

    
respondido por el Dev_Giri 11.05.2015 - 14:28
fuente

Lea otras preguntas en las etiquetas