Forma correcta de crear una contraseña de hash salada

Soy nuevo en el almacenamiento de contraseñas en las bases de datos y de lo que he leído he creado un script php simple a continuación

 
  1. ¿Estoy haciendo esto correctamente?
  2. ¿Debería almacenarse la sal en las bases de datos como tipo de datos byte?
  3. ¿Debería almacenarse el hash final en el tipo de datos String en la base de datos?

Los algoritmos SHA * no son apropiados para las contraseñas hash, porque son demasiado rápidas y, por lo tanto, pueden forzarse demasiado rápido. En su lugar, uno debe usar un algoritmo lento como BCrypt o PBKDF2 con un factor de costo, que controla el tiempo necesario.

PHP admite el algoritmo BCrypt con la nueva función password_hash () . También existe un paquete de compatibilidad para versiones anteriores de PHP.

 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); // 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); 

Se recomienda que no pase su propia sal, sino que la función cree una sal criptográficamente segura a partir de la fuente aleatoria del sistema operativo.

La sal se incluirá en el valor hash resultante, por lo que no es necesario almacenarlo por separado. Simplemente cree un campo de cadena de 60 caracteres en su base de datos y almacene el valor hash. La función password_verify() extraerá la sal usada del valor hash almacenado. Para obtener más información, puede echar un vistazo a mi tutorial sobre el almacenamiento de contraseñas .

Si está ejecutando (PHP 5 >= 5.5.0) , puede aprovechar la función de hashing de contraseña de php incorporada.

Uso simple:

 $options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), // or your own salt here ]; $pass_hash = password_hash("helloworld", PASSWORD_BCRYPT, $options); if (password_verify('helloworld', $pass_hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } 

normalmente almacenaba la sal con contraseña hash. Tengo mi propio formato para reconocer la sal de la contraseña hash. por ejemplo, la contraseña hash es 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824, y la sal es aaabbb. Agregué sal a la contraseña hash como 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824aaabbb. Así que puedo reconocer que las últimas 6 palabras son sal para esta contraseña hash. Incluso el DB ha sido pirateado, todavía no sabían la sal y la contraseña real.