Es segura la contraseña con hash si sal y la clave se almacenan con el hash

-1

Estoy intentando hacer un hash de la contraseña usando SHA256 con sal aleatoria y clave aleatoria en php y almacenar el valor de hash nuevo con sal y clave utilizada. Quiero saber si esto proporciona seguridad adecuada?

El siguiente es el código:

function hashpwd($string, $salt, $KEY)
{
    if(strcmp($KEY, '')==0)
        $KEY=openssl_random_pseudo_bytes(32); //key used for encryption and decryption
    if(strcmp($salt, '')==0)
    {
        $salt= openssl_random_pseudo_bytes(32);
    }
    $string = $salt.$string;
    $pwd = hash_hmac("SHA256", $string, $KEY);
    //echo "$salt".$pwd."<br>";
    return base64_encode($salt).base64_encode($KEY).$pwd;
}

¿Debo usar sal doble?

Nota: el funcionamiento en la PC no está seguro de ofrecer múltiples iteraciones de hash.

EDITAR:

Cambié el código a siguiente, usé password_hash () con BCRYPT y 5000 rondas:

function hashpwd($password)
{
        $salt='';
        $strong = FALSE;
        while (!$strong){
            $salt = openssl_random_pseudo_bytes(32,$strong);
        }
        $pwd = rtrim(password_hash($password, PASSWORD_BCRYPT, array('rounds'=> 5000, 'salt'=> $salt)));
        return $pwd;
}

¿Es el código anterior lo suficientemente bueno?

No estoy cuestionando la seguridad de BCRYPT. Mi pregunta fue para saber cuál de los dos códigos era mejor usar.

    
pregunta Abhishek V 19.06.2015 - 07:21
fuente

1 respuesta

2

Definitivamente puedes usar múltiples iteraciones de hashes; ¡Puedo usar de miles a cientos de miles de iteraciones incluso en mi teléfono inteligente!

Para PHP en particular, mire las funciones password_hash () y password_verify (), por las Contraseña de PHP.net Preguntas frecuentes sobre el hash . Use el modo PASSWORD_BCRYPT, y establezca el costo tan alto como su hardware pueda manejar y aún así proporcionar los tiempos de respuesta que el usuario está dispuesto a aceptar. Por lo general, puede usar una fracción de segundo razonable, ya que el buen hashing de contraseña es de un solo hilo.

Lea la respuesta canónica de Thomas Pornin a ¿Cómo hacer hash de las contraseñas de forma segura? antes de probar el hashing de contraseñas. Para resumir:

  • Nunca use una sola pasada de ningún algoritmo de hash.
  • Nunca lance el suyo, que es lo que es su ejemplo 2 (y el ejemplo 1 también, si + significa concatenación).
  • Nombre de usuario almacenado en el claro
  • Sal generada por usuario, 8-16 bytes aleatorios, almacenada en el claro
    • en binario puro o codificado en Base64 o hex o lo que quieras.
  • Use BCrypt, SCrypt o PBKDF2
  • Use el factor de trabajo / costo / iteración más alto que su CPU puede manejar durante las horas pico futuras previstas.
  • Para PBKDF2 en particular, no solicite más bytes de salida binarios que los que produce el hash nativo. Yo diría que no menos de 20 bytes binarios, independientemente.
    • SHA-1: salida = 20 bytes (40 dígitos hexadecimales)
    • SHA-224: 20 bytes < = salida < = 28 bytes (56 dígitos hexadecimales)
    • SHA-256: 20 bytes < = salida < = 32 bytes (64 dígitos hexadecimales)
    • SHA-384: 20 bytes < = salida < = 48 bytes (96 dígitos hexadecimales)
    • SHA-512: 20 bytes < = salida < = 64 bytes (128 dígitos hexadecimales)
  • Para PBKDF2 en particular, SHA-384 y SHA-512 tienen una ventaja comparativa en los sistemas de 64 bits por el momento, ya que muchos atacantes de la GPU vintage 2014 tendrán un margen de ventaja menor para las operaciones de 64 bits sobre su defensiva CPUs de lo que lo harían en operaciones de 32 bits.
respondido por el Anti-weakpasswords 19.06.2015 - 08:31
fuente

Lea otras preguntas en las etiquetas