Joven hacker sonriendo

Cifrar contraseñas con SALT

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en PHP, cifrando contraseñas con SALT aleatorio usando el algoritmo SHA256, reforzando su seguridad al hacerlas más difíciles de romper por atacantes malintencionados.

Necesidad

Resumen de mensaje con salt para contraseñas en PHP v5.3

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se desarrolla una aplicación en PHP v5.3

  2. Se requiere el uso de funciones de resumen hash para cifrado de contraseñas.

  3. Se requiere implementar salt al momento de cifrar las contraseñas.

Solución

Con el fin de mejorar la seguridad de un sistema en el cual se utilizan contraseñas, se debe implementar un algoritmo de cifrado en conjunto a un valor SALT generado de forma aleatoria.

Los valores Salt son números de dígitos aleatorios que se le agregan al hash ya sea al principio o al final. Con lo que los hashes ya no son los normales y por ende no figurarán en una tabla de hashes haciendo más difícil el decodificarlos.

La SALT actúa como una seed que permitirá al algoritmo de cifrado tener en cuenta esos valores para generar el hash resultante. Esto garantiza que la contraseña será mucho más complicada de romper para un atacante y por ende, más segura.

  1. Vamos a emplear el algoritmo SHA256 y para su utilización se debe hacer uso de la función de PHP crypt en función del SALT.

  2. El SALT lo extraemos de manera aleatorio en un alfabeto de 22 caracteres dentro del arreglo “valores_salt”, para obtener un cifrado de mayor calidad.

    ejemplo.php
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?php
    
    $password = 'clave123456';
    $valores_salt = './1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $salt = sprintf('$5$rounds=5000$', 7);
    
    for($i = 0; $i < 22; $i++) {
     $salt .= $valores_salt[mt_rand(0, 63)];
    }
    
    echo "Contraseña: ".crypt($password, $salt);
    
    ?>
    
  3. La contraseña cifrada la podemos almacenar en la base de datos, y al momento que un usuario se autentique en la aplicación podemos comprobar si la clave ingresada es válida con la siguiente instrucción:

    ejemplo.php
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?php
    
    $contrasenarecibida= 'clave123456';
    $passwbd = '$5$rounds=5000$eJXEzCMbmiAjCjuz$yBaYLFSiSrtltKL1G.O65GEdaG.SszQb8vrlz246mV1';
    
    if(crypt($contrasenarecibida, $passwbd) == $passwbd) {
      echo 'Es igual, el usuario se ha autenticado.';
    }
    else {
      echo "Lo siento, revisa tus credenciales de acceso.";
    }
    
    ?>
    

Los valores generados aleatoriamente que componen la SALT no deben reutilizarse, puesto que podrían facilitar a un atacante la tarea romper la contraseña y obtener acceso al sistema. Es importante tener en cuenta que en caso de que se requieran almacenar los valores usados como SALT por cada contraseña, se debe optar por hacerlo en una base de datos a parte, de forma que si la base de datos principal se ve comprometida, se pueda evitar accesos al sistema por parte autores maliciosos.




Haz un comentario

Estado de los servicios - Términos de Uso