usar password_verify password_hash password funciona desencriptar como php mysql login passwords

php - password_hash - password_verify no funciona



PHP y MySQL comparar contraseƱa (5)

En primer lugar, asegúrese de escaparse correctamente de sus variables antes de usarlas en la consulta: use mysql_real_escape_string ().

Entonces, ¿por qué no utilizar la función MySQL MD5 para verificar un inicio de sesión válido en su consulta?

SELECT login FROM customer WHERE login=''$login'' AND password = MD5(''$password'')

Luego simplemente use mysql_num_rows () para contar el número de filas devueltas.

¿Cómo se comprueba si un usuario ha ingresado la contraseña correcta para iniciar sesión?

Esto es lo que (de un montón de combinaciones ...) estoy haciendo:

<? $login = $_POST[''login'']; $password = $_POST[''password'']; mysql_connect(''localhost'', ''root'', ''abc123''); mysql_select_db(''aun_vox'') or die(mysql_error()); $q = mysql_query("SELECT password FROM customer WHERE login=''$login''"); $db_pass = mysql_result($q, 0); if(md5($password) == $db_pass) { echo "You did it."; } else echo "Wrong."; ?>

Como puedo ver en la salida, hay algo mal en el bit de mysql_result , pero no puedo encontrar el camino correcto.

Puede ayudarme alguien, por favor.


Veo que está almacenando un hash de la contraseña en la base de datos, pero para el beneficio de otros lectores, nunca almacene contraseñas en texto plano en la base de datos. ¡No quieres ser como Monster.com.uk !

Debería usar una función hashing más fuerte que MD5() . Lo ideal es que uses SHA256. Este método hash está disponible en PHP utilizando la hash() .

También debe aplicar una sal aleatoria a la contraseña. Almacene un valor de sal diferente para la cuenta de cada usuario. Esto ayuda a vencer los ataques de diccionario y los ataques de tabla de arcoíris .

Debería aprender a utilizar la extensión mysqli en lugar de la antigua extensión mysql. Mysqli admite consultas parametrizadas, por lo que puede reducir la vulnerabilidad a algunos ataques de inyección SQL.

Aquí hay un código de ejemplo. No lo he probado, pero debería estar muy cerca de funcionar:

$input_login = $_POST[''login'']; $input_password = $_POST[''password'']; $stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?"); $stmt->bind_param("s", $input_login); $stmt->execute(); $stmt->bind_result($password_hash, $salt); while ($stmt->fetch()) { $input_password_hash = hash(''sha256'', $input_password . $salt); if ($input_password_hash == $password_hash) { return true; } // You may want to log failed password attempts here, // for security auditing or to lock an account with // too many attempts within a short time. } $stmt->close(); // No rows matched $input_login, or else password did not match return false;

Algunas otras personas sugieren que la consulta debería probar login = ? AND password = ? login = ? AND password = ? pero no me gusta hacer eso Si hace esto, no puede saber si la búsqueda falló porque el inicio de sesión no existía o porque el usuario proporcionó una contraseña incorrecta.

Por supuesto, no debe revelarle al usuario cuál fue el motivo del intento fallido de inicio de sesión, pero es posible que deba saberlo para que pueda registrar actividad sospechosa.

@Javier dice en su respuesta que no debe recuperar la contraseña (o el hash de contraseña en este caso) de la base de datos. No estoy de acuerdo

Javier muestra llamar a md5() en código PHP y enviar esa cadena hash resultante a la base de datos. Pero esto no permite salarizar la contraseña fácilmente. Tienes que hacer una consulta por separado para recuperar la sal de este usuario antes de poder hacer el hash en PHP.

La alternativa es enviar la contraseña de texto plano a través de la red desde su aplicación PHP a su servidor de base de datos. Cualquier persona que intercepte su red puede ver esta contraseña. Si tiene consultas SQL registradas, cualquier persona que obtenga acceso a los registros puede ver la contraseña. Los piratas informáticos motivados incluso pueden sumergirse en el basurero para encontrar medios antiguos de copia de seguridad del sistema de archivos, ¡y pueden leer los archivos de registro de esa manera!

El menor riesgo es obtener la cadena de hash de la contraseña de la base de datos en la aplicación PHP, compararla con el hash de la entrada del usuario (también en código PHP), y luego descartar estas variables.


algunos puntos:

  • NO inserte datos de cadena en la cadena de consulta. Especialmente datos proporcionados por el usuario. ¿Qué pasaría si inicio sesión con "Robert", drop table customer "?. Utilice las rutinas de escape o (mucho mejor) use declaraciones preparadas y parámetros de vinculación.
  • NO almacene contraseñas claras en su base de datos. (Estás bien en esto)
  • NO recuperes contraseñas de tu base de datos.

lo que suelo hacer es algo así como:

$q = preparestatement ("SELECT id FROM customer WHERE login=? AND password=?"); bindvalue ($q, $_POST[''login'']); bindvalue ($q, md5($_POST[''password''])); $id = execprepared ($q); if($id) { echo "You did it."; } else { echo "Wrong."; }


Obtenga la contraseña del usuario del método FORM POST y convierta $ _POST [''password''] // del formulario // en el formato apropiado en php / jsp / any other luego compare con la contraseña formateada en su base de datos

En general, se utiliza el cifrado md5 cuando se puede comparar md45 (''{$ _ POST ['' password '']}'') = presente en su db; o generalmente usa la contraseña de mysql (''tu contraseña'') mientras creas la contraseña, por lo tanto primero concierta tu $ _POST [''contraseña''] en mysqli_query y mysqli_fetch_array para obtener el valor de la contraseña cifrada y luego compara.


Más que PHP 5.6, puedes usar la función hash_compare.

$users_password = hash(sha256,$salt.$post_password); if (hash_equals($users_dbpassword, $users_password)) { //pass is good } else { // pass failed }

http://php.net/manual/ru/function.hash-equals.php