¿Este fragmento de código es suficientemente bueno para el hash y el salt de contraseñas?

11

Después de unos días leyendo acerca de las contraseñas de salado y hash, encontré un fragmento de código real que indica cómo hacerlo. Esto es lo que encontré:

$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(22));  
$hash = crypt($data, "$2a$12$".$blowfish_salt);  

¿Es esta una buena manera de hacerlo?

    
pregunta vinaya 24.07.2013 - 12:26
fuente

3 respuestas

14
  1. Es más fácil usar la función php 5.5 password_hash , o si está utilizando una versión anterior, la biblioteca de compatibilidad
  2. openssl_random_pseudo_bytes a veces sufre problemas de rendimiento. Considere mcrypt_create_iv (size, MCRYPT_DEV_URANDOM) en su lugar.
  3. la codificación de sal es complicada. Hex no usa el espacio de manera óptima, y Base64 normal usa caracteres no válidos.

    $salt = substr(strtr(base64_encode($randomSalt), '+', '.'), 0, 22);
    

    debería hacer el truco.

Combinando estos obtienes

$binarySalt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$salt = substr(strtr(base64_encode($binarySalt), '+', '.'), 0, 22);

Compruebe Siete maneras de arruinar BCrypt en el blog de ircmaxell para leer más.

    
respondido por el CodesInChaos 24.07.2013 - 14:02
fuente
2

No hay nada de malo en tu código. Sin embargo, siempre prefiero usar bibliotecas ya hechas para el hashing de contraseñas siempre que sea posible. Para PHP, hay una excelente implementación disponible en PHPass .

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

$hash = $pwdHasher->HashPassword( $password );

La verificación también se hace por ti.

$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}
    
respondido por el Ayrx 24.07.2013 - 13:57
fuente
0

Lo estás haciendo correctamente. La sal que está generando se considera aleatoria y lo suficientemente larga (tenga en cuenta que una sal debe ser única por contraseña). También está utilizando bcrypt, que se considera un algoritmo de hashing de contraseña seguro.

    
respondido por el Lucas Kauffman 24.07.2013 - 12:38
fuente

Lea otras preguntas en las etiquetas