Cómo utilizar sha256 en php5.3.0
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.
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:
- Obtener la contraseña de forma
- hash de la contraseña
- contraseña almacenada
- 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.