Muchas veces, al inyectar un sitio web nos topamos con passwords en texto plano: MD5 o SHA-1

Passwords Seguras 2

Hay programadores -que quizás por ignorancia- no conocen este tipo de ataques y lo peligroso que pueden ser.

Además del SQLi, existen varias formas de poder obtener las credenciales del administrador de un sitio. Incluso si logran arrebatar la base de datos del mismo.

Algo que podemos hacer, es generar passwords seguras y en caso de que alguien logre obtener el hash, no pueda descifrarlo o le resulte en extremo complejo.

De esta forma, cada contraseña que generemos, será totalmente diferente a las demás y la única forma de averiguarla será obteniendo el algoritmo para generarla.

¿QUÉ ES UN HASH?

Un hash es una cadena de texto que se logra aplicando un proceso matemático o algorítmico con la finalidad de transformar ese texto en una nueva cadena totalmente inentendible. Una vez obtenido este hash, es difícil volver al texto original sin conocer el proceso que se aplicó para obtenerlo.

MD5 y SHA-1 son uno de los tantos tipos de hashes que existen, el motivo por el cual los menciono, es porque son los más utilizados hoy en día. Lo malo de ellos es que existen muchas formas de descifrarlos por fuerza bruta o diccionario, y de esta forma recuperar el texto plano.

Algunas reglas básicas para generar una contraseña segura pueden ser:

Usar siempre una semilla o salt.
La semilla debe ser los más aleatoria posible.
Utilizar una semilla diferente para cada password.
No almacenar la semilla en ninguna parte.

SALT

La finalidad del salt es generar un string aleatorio y añadirlo al password. De esta forma, aumentará la longitud del password y también la complejidad para descifrarlo.

El ataque de Rainbow Table (Tabla Arco Iris), solo funciona cuando las passwords han sido hasheadas con el mismo salt. Si usamos el mismo salt para todas las passwords correremos el riesgo de que puedan romperlas. Es por ello, que lo aconsejable es crear un salt distinto para cada password.

Para generar salts aleatorios en PHP, lo mejor es usar las funciones mcrypt_create_iv o openssl_random_pseudo_bytes

A continuación, un ejemplo, de su uso

1
2
3
4
5
6
7
<?php
$user = $_POST['user'];
$pass = $_POST['pass'];
$salt = str_replace('=', '.', base64_encode(mcrypt_create_iv(20)));
$hash = hash_hmac('SHA512', $pass, $salt);
var_dump($hash);
?>

Básicamente, lo que hace el código es recibir una password por POST, luego generamos un salt y lo unimos a la contraseña del usuario y finalmente lo ‘encriptamos’ con SHA512

Con esto podemos tener una password “segura”. Lo remarco con comillas, ya que pienso que la seguridad es un mito. No existe nada que sea 100% seguro.

A pesar de tener este nuevo hash difícil de crackear, hoy en día existen máquinas que se usan únicamente para romper contraseñas, por lo que podemos hacer esta tarea un poco más difícil añadiendo una iteración al código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function hash_password($password, $salt)
{
    $hash = hash_hmac('SHA512', $pass, $salt);
    for ($i = 0; $i < 5000; $i++)
    {
        $hash = hash_hmac('SHA512', $hash, $salt);
    }  
    return $hash;
}
$user = $_POST['user'];
$pass = $_POST['pass'];
$salt = str_replace('=', '.', base64_encode(mcrypt_create_iv(20)));
$hash = hash_password($pass, $salt);
var_dump($hash);
?>

Como se puede ver en el código, estas 5.000 iteraciones vuelve un poco más seguro y difícil de crackear.

Con estos algoritmos, podremos tener un nivel medio de seguridad a la hora de guardar nuestras contraseñas y en caso de que alguien obtenga algún hash, no podrá descifrarlo fácilmente.

Espero que les guste!
ANTRAX

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *