tipos password encriptar encriptada encriptacion desencriptar contraseña con php security passwords blowfish crypt

password - Cómo crear y almacenar hashes de contraseña con Blowfish en PHP



password hash php (2)

1) ¿Cómo creas hashes Blowfish seguros de contraseñas con crypt ()?

$hash = crypt(''somePassword'', ''$2a$07$nGYCCmhrzjrgdcxjH$'');

1a) ¿Cuál es el significado de "$ 2a"? ¿Solo indica que se debe usar el algoritmo Blowfish?
1b) ¿Cuál es el significado de "$ 07"? ¿Un valor más alto implica un hash más seguro?
1c) ¿Cuál es el significado de "$ nGYCCmhrzjrgdcxjH $"? ¿Es esta la sal que se utilizará? ¿Debería esto ser generado aleatoriamente? Hard-coded?

2) ¿Cómo almacena hashes Blowfish?

echo $hash; //Output: $2a$07$nGYCCmhrzjrgdcxjH$$$$.xLJMTJxaRa12DnhpAJmKQw.NXXZHgyq

2a) ¿Qué parte de esto debería almacenarse en la base de datos?
2b) ¿Qué tipo de datos deben usarse para la columna (MySQL)?

3) ¿Cómo se debe verificar un intento de inicio de sesión?


1a) Fuerza de cifrado: requisito en el rango de 4..31. Ver http://php.net/manual/en/function.crypt.php

1b) Ver 1a

1c) Ver 1a. ''sal'' no debe ser aleatorio, o no podrá regenerar el mismo hash para una entrada dada - vea 3.

2a) Estrictamente hablando, todo excepto el hash (en caso de que la base de datos esté comprometida). Además, almacene su sal en un archivo que no sea accesible debajo de la raíz de documentos del servidor web e inclúyalo. Configúralo con los permisos más estrictos posibles; lo ideal es leer solo para el servicio de alojamiento web (por ejemplo, apache), sin privilegios de escritura o ejecución. Hablando menos estrictamente, depende de qué tan defensivo quieras estar contra los hackers. No almacenar la sal solo dificulta la vida; todavía tienen que hacer que los datos se ingresen correctamente en el algoritmo, pero ¿por qué hacerlo más fácil?

2b) VARCHAR (32) debería estar bien para el pez globo, si no almacena el hash

3) Suponiendo que ya ha ejecutado el código de prevención de inyección adecuado, etc., así que no solo copie ciegamente a continuación (e idealmente use PDO en lugar de la extensión mysql). El siguiente es específico para el pez globo, SHA-256 y SHA-512 que devuelven la sal dentro del hachís. Necesitaría modificación para otros algoritmos ...

//store this in another file outside web directory and include it $salt = ''$2a$07$somevalidbutrandomchars$'' ... //combine username + password to give algorithm more chars to work with $password_hash = crypt($valid_username . $valid_password, $salt) //Anything less than 13 chars is a failure (see manual) if (strlen($password_hash) < 13 || $password_hash == $salt) then die(''Invalid blowfish result''); //Drop the salt from beginning of the hash result. //Note, irrespective of number of chars provided, algorithm will always //use the number defined in constant CRYPT_SALT_LENGTH $trimmed_password_hash = substring($password_hash, CRYPT_SALT_LENGTH); mysql_query("INSERT INTO `users` (username,p assword_hash) VALUES ''$valid_username'', ''$trimmed_password_hash''"); ... $dbRes = mysql_query("SELECT password_hash FROM `users` WHERE username = ''$user_input_username'' LIMIT 1"); //re-apply salt to output of database and re-run algorithm testing for match if (substring($salt, CRYPT_SALT_LENGTH) . mysql_result($dbRes, 0, ''password_hash'') ) === crypt($user_input_username . $user_input_password, $salt) ) { //... do stuff for validated user }


Debería almacenar toda la salida de crypt, no tiene mucho sentido dividirla, ya que necesita generar un nuevo salt para cada contraseña que esté haciendo hashing en cualquier caso. Usar una sal oculta fija como lo menciona Matt es incorrecto: la sal debe ser diferente para cada hash.

Para obtener más información, visite http://www.openwall.com/articles/PHP-Users-Passwords - Recomiendo usar la biblioteca phpass porque maneja la generación de sal aleatoria para usted, a diferencia de crypt ().