password_hash password_bcrypt password online ejemplo desencriptar php mysql hash passwords php-password-hash

password_bcrypt - Usando la función password_hash y password_verify de PHP 5.5



password verify php (4)

Digamos que quería almacenar una contraseña para un usuario, ¿sería esta la manera correcta de hacerlo con la función password_hash() PHP 5.5 (o esta versión para PHP 5.3.7+: https://github.com/ircmaxell/password_compat )?

$options = array("cost" => 10, "salt" => uniqid()); $hash = password_hash($password, PASSWORD_BCRYPT, $options);

Entonces yo haría:

mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options[''salt'']);

Para insertar en la base de datos.

Luego para verificar:

$row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid")); $salt = $row["salt"]; $hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt)); if (password_verify($password, $hash) { // Verified }


Ignorando los problemas con las declaraciones de su base de datos por ahora, responderé la pregunta relacionada con password_hash .

En resumen, no, así no es como lo haces. No desea almacenar solo la sal, debe almacenar el hash y la sal y luego usar ambos para verificar la contraseña. password_hash devuelve una cadena que contiene ambos.

La función password_hash devuelve una cadena que contiene tanto el hash como el salt. Asi que:

$hashAndSalt = password_hash($password, PASSWORD_BCRYPT); // Insert $hashAndSalt into database against user

Luego para verificar:

// Fetch hash+salt from database, place in $hashAndSalt variable // and then to verify $password: if (password_verify($password, $hashAndSalt)) { // Verified }

Además, como sugieren los comentarios, si le interesa la seguridad, puede consultar mysqli ( ext/mysql está en desuso en PHP5.5), y también este artículo sobre inyección SQL: http://php.net/manual/en/security.database.sql-injection.php


No debe ingresar su propia sal, deje la sal vacía, la función generará una buena sal aleatoria.

Inserta en la base de datos (o archivo o lo que sea que uses) toda la cadena devuelta por la función. contiene: identificación del algoritmo, costo, sal (22 caracteres) y contraseña hash.

Se requiere toda la cadena para usar password_verify (). La sal es aleatoria y no hace daño caer en las manos equivocadas (con contraseña hash). Esto impide (o muy difícil) utilizar conjuntos listos listas generadas de contraseñas y hash - tablas de arcoíris.

Debería considerar agregar el parámetro de costo. El valor predeterminado (si se omite) es 10 ; si es más alto, la función calcula el hash más tiempo. Incrementando el costo en 1, doble tiempo necesario para generar un hash (y así alargar el tiempo que lleva romper la contraseña)

$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10));

debe establecer este parámetro en función de la verificación de velocidad en su servidor. Se recomienda que la función realice 100ms + (algunos prefieren hacerlo 250 ms). Por lo general, el costo = 10 u 11 es una buena opción (en 2015).

Para aumentar la seguridad, es posible que desee agregar a las contraseñas una cadena secreta larga (de 50 a 60 caracteres). antes de usar password_hash () o password_verify ().

$secret_string = ''asCaahC72D2bywdu@#$@#$234''; $password = trim($_POST[''user_password'']) . $secret_string; // here use password_* function

Precaución El uso del PASSWORD_BCRYPT para el parámetro algo, dará como resultado el parámetro de contraseña truncado a una longitud máxima de 72 caracteres.

Si $ password será más largo que 72 caracteres y cambia o agrega 73 o 90 caracteres, el hash no cambiará. Opcional, pegando $ secret_string debe estar al final (después de la contraseña del usuario y no antes).


No se recomienda usar su propia sal y, a partir de PHP 7, su uso está en desuso . Para entender por qué, lea los pensamientos del autor

Una cosa me ha quedado muy clara: la opción de la sal es peligrosa. Aún no he visto un solo uso de la opción de sal que haya sido incluso decente. Cada uso va desde malo (pasando mt_rand () salida) a peligroso (cadenas estáticas) a locura (pasando la contraseña como su propia sal).

Llegué a la conclusión de que no creo que debamos permitir que los usuarios especifiquen la sal.


Tenga en cuenta esto de php.net

Advertencia

La opción sal ha quedado obsoleta a partir de PHP 7.0.0. Ahora se prefiere simplemente usar la sal que se genera de manera predeterminada.

¿Conclusión? Olvídate de la opción de sal.

Esto sería suficiente password_hash(''password'', PASSWORD_DEFAULT) * (o _BCRYPT)