Pregunta

Estoy usando sha256 para cifrar la contraseña. Puedo guardar los sha256 contraseña cifrada en MySQL. Pero no puedo iniciar sesión con la misma cláusula.

Escribe el código:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";

Seleccione el código:

<?php 
error_reporting(E_ALL ^ E_NOTICE);

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
    //get user input
    $username = $_POST['username'];
    $ppasscode = $_POST['ppasscode'];
    //$passcodeen = hash('sha256', $ppasscode);
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
    //get session value from mysql
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());

¿Hay algo mal? Estoy muy confundido. Gracias.

¿Fue útil?

Solución

Podría ser un error tipográfico? (Dos P en ppasscode, destinado?)

$_POST['ppasscode'];

Me aseguraría y hacer:

print_r($_POST);

y asegúrese de que los datos sean exactos allí, y luego echo un vistazo a lo que debe ser similar:

echo hash('sha256', $_POST['ppasscode']);

Comparar esta salida a lo que tiene en la base de datos (manualmente). Al hacer esto usted está explorando sus posibles puntos de fallo:

  1. Obtener la contraseña de forma
  2. hash de la contraseña
  3. contraseña almacenada
  4. Comparación de los dos.

Otros consejos

En primer lugar, sha256 es un algoritmo hash, no un tipo de cifrado. Un cifrado requeriría tener una manera de descifrar la información de nuevo a su valor original (colisiones de lado).

En cuanto a su código, parece que debería funcionar si usted está proporcionando el parámetro correcto.

  • Trate de usar una cadena literal en el código primero, y verificar su validez en lugar de utilizar la variable $_POST[]

  • Trate de mover la comparación de la consulta de base de datos para el código (obtener el hash para el usuario dado y se compara con el hash que acaba calculado)

Pero lo más importante antes de implementar esto en cualquier clase de manera pública, recuerde que debe desinfectar sus entradas. No permita que SQL arbitrario que se insertan en las consultas. La mejor idea aquí sería utilizar consultas parametrizadas.

Debe utilizar hash adaptativo como http://en.wikipedia.org/wiki/Bcrypt para asegurar contraseñas

Lo primero es hacer una comparación de las funciones de SHA y optar por el algoritmo más seguro que apoye su lenguaje de programación (PHP).

A continuación, puede masticar la documentación oficial para implementar la función hash() que recibe como argumento el algoritmo de hash que ha elegido y la contraseña en bruto.

sha256 => 64 bits sha384 => 96 bits sha512 => 128 bits

El más seguro el algoritmo de hash es, mayor es el costo en términos de hashing y tiempo para recuperar el valor original de la del lado del servidor.

$hashedPassword = hash('sha256', $password);

Una forma mejor solución es usar el archivo de compatibilidad excelente de Anthony Ferrara:

https://github.com/ircmaxell/password_compat

Por favor, y también, al comprobar la contraseña, añadir siempre una forma (preferibly asíncrona, por lo que no afecta el proceso de registro para los ataques timming) para actualizar el hash si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top