Almacenamiento de contraseñas PHP y MYSQL

publicado por: Anonymous

Necesito saber cómo funcionan los mecanismos de hash() o password_hash() Estoy haciendo una aplicación y quiero encriptar para que así se almacene en la base de datos y cuando quiera comparar esa cadena ingresada en un login no me arroje un error.
Por ejemplo

$pass="pepito";
$hashed_pass = password_hash($pass, PASSWORD_DEFAULT);
insert into tabla (password) values ($hashed_pass);

Y cuando vaya a consultar me regrese el valor pero que decifre el valor que se envío cifrado

Por ejemplo

$pass="pepito";
select password from tabla where password = $pass;

Obviamente me lanzará un error por que antes debo de pasar la contraseña al algoritmo de hash, sin embargo hice unas pruebas y cada vez que doy hash, cambia totalmente el algoritmo, eso me impide comparar la contraseña en la base de datos y me traiga los valores

Ayuda, gracias.

solución

Te voy a dejar un ejemplo como guardar de metodo segura la contraseña con password_hash(), no aplicaria un md5 solo, ya que existen páginas donde podemos descrifrar facilmente las contraseñas md5, por ejemplo.

http://md5cracker.org/

Veamos el funcionamiento password_hash(), crea un nuevo hash de contraseña usando un algoritmo de hash fuerte de único sentido. password_hash() es compatible con crypt(). Por lo tanto, los hash de contraseñas creados con crypt() se pueden usar con password_hash().

//Obtenemos contraseña desde un form.
$contrasena = $_POST['contra'] ?: '';

//Encriptamos de manera segura la contraseña
$contrasena = password_hash(
                    base64_encode(
                        hash('sha256', $contrasena, true)
                    ),
                PASSWORD_DEFAULT
            );


//Sentencia SQL.
$stmt = $conexion->prepare("INSERT INTO tabla (password) VALUES (?)");

//Ligamos parametros marcadores.
$stmt->bind_param("s",$contrasena);

//Ejecutamos sentencia.
$stmt->execute();

//Cerramos sentencia.
$stmt->close();

Ahora vemos como podemos verificar la contraseña insertada con hash_equals.

hash_equals — Comparación de strings segura contra ataques de temporización

$contrasena = $_POST['contra'] ?: '';    

//Encriptamos de manera segura la contraseña
$contrasena = password_hash(
                    base64_encode(
                        hash('sha256', $contrasena, true)
                    ),
                PASSWORD_DEFAULT
            );

//Sentencia SQL
$stmt = $conexion->prepare("SELECT password FROM tabla WHERE password = ?";

//Ligamos parametros marcadores.
$stmt->bind_param("s",$contrasena);

//Ejecutamos sentencia.
$stmt->execute();  

$stmt->store_result();
if($stmt->num_rows===1) {

    $stmt->bind_result($contrasenaBD);
    $stmt->fetch();
    $stmt->close();

   if (hash_equals($contrasena,$contrasenaDB) {
      //Hacemos algo.
   }        

} else { $stmt->close(); }

Ejemplo a tu segunda prejunta.

if(isset($_REQUEST["login_pass"])){$login_pass = $_REQUEST["login_pass"];}else{$login_pass = "";}
require 'conexion.php';

$login_pass = "2000000";

$contrasena = password_hash(
    base64_encode(
        hash('sha256',$login_pass, true)
    ),
    PASSWORD_DEFAULT
);

//password_verify — Comprueba que la contraseña coincida con un hash, asique no debes volver a hashearla con password_hash.

$sql_in="SELECT LIDER_EXPLOIT FROM LIDERES WHERE LIDER_EXPLOIT ='".$contrasena."'";

$result = mysqli_query($conn,$sql_in);
$row=mysqli_fetch_array($result);

//Comprobación -> Contraseña -> OK
if (password_verify(
        base64_encode(
            hash('sha256', $login_pass, true)
        ),
        $row["LIDER_EXPLOIT"]
)) {

  echo 'es igual';
}
else
{
  echo 'no es igual';
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *