在使用准备好的语句提取mysql信息时使用aes进行解密

bjg7j2ky  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(473)

昨天我接受了关于尝试散列我的用户名的教育,之后我决定使用mysql中的aesïu加密和解密函数来安全地存储我的用户名。从目前的情况来看,我可以通过以下方式对它们进行加密并将其存储在我的数据库中:

$con=mysqli_connect($servername, $dbusername, $dbpassword, $dbname);
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$stmt = $con->prepare("INSERT INTO users (username, password) VALUES (AES_ENCRYPT(?, '$aesKey'), ?)");
$stmt->bind_param("ss", $username, $password);
$username = $_POST['username'];
$plainPass = $_POST['password'];
$password = password_hash($plainPass, PASSWORD_ARGON2I);
$stmt->execute();
$stmt->close();
$con->close();
echo "<script> location.href='login.php'; </script>";
}
?>

我使用的是从配置文件加载的256位加密密钥,称为 $aesKey 但是,当我尝试登录时,我无法。什么都没发生。没有sql错误被打印出来,但是我得到了 PHP Notice: Undefined variable: username . 代码如下:

$submittedUser = $_POST['username'];
$submittedPass = $_POST['password'];

$con=mysqli_connect($servername, $dbusername, $dbpassword, $dbname);
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if ($stmt = mysqli_prepare($con, "SELECT * FROM users Where username =AES_DECRYPT(?, '$aesKey')")) {
                    mysqli_stmt_bind_param($stmt, "s", $submittedUser);
                    mysqli_stmt_execute($stmt);
                    $result = mysqli_stmt_get_result($stmt);
                    echo mysqli_error($con);

}

while($row = mysqli_fetch_array($result))
{
$username = $row['username'];
$password = $row['password'];
}
if ($submittedUser == $username && password_verify($submittedPass, $password))
{
$_SESSION['user']=$username; 

//echo "<script> location.href='index.php'; </script>";
//        exit;   
}
else
{
 //echo "<script> location.href='login.php'; </script>";
//        exit;   
}
mysqli_close($con);
}
?>

我注解掉了重定向,因为我最初认为它们是导致错误消息无法打印的原因。有人能帮我吗?我似乎不知道什么不起作用。
编辑:我把语句改回 "SELECT * FROM users Where username =AES_ENCRYPT(?, '$aesKey')" 我收到以下输出:

Array ( [0] => 5�uY��V�s~"�ܮ� [username] => 5�uY��V�s~"�ܮ� [1] => $argon2i$v=19$m=1024,t=2,p=2$akcuREppYk1ERjRlUi5ZQw$yIdC5oMblekARArcB0XjwwmWywJ824iM8FmKqAu+9ys [password] => $argon2i$v=19$m=1024,t=2,p=2$akcuREppYk1ERjRlUi5ZQw$yIdC5oMblekARArcB0XjwwmWywJ824iM8FmKqAu+9ys )`

编辑2:这里是数据库结构。未加密的用户名应为evan,未加密的密码应为edwards。

--
-- Table structure for table `users`
--

CREATE TABLE `users` (
  `username` text NOT NULL,
  `password` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`username`, `password`) VALUES
('5ÇuY¯úVõs~\"ÐÜ®€', '$argon2i$v=19$m=1024,t=2,p=2$NWZQS2Q3dE1ORndjaUdpWg$vOR3DBT+IhdAXIt7YUPDiExalf1lsMeIVe/zTZDDYfU');

编辑3:运行以下代码:

<?php

include 'config.php';
$con=mysqli_connect($servername, $dbusername, $dbpassword, $dbname);
$result = mysqli_query($con,"SELECT * FROM `users`");
while($row = mysqli_fetch_array($result))
{
echo $row['username'];
echo "<br>";
echo $row['password'];
}
mysqli_close($con);
?>

给出以下结果:

5�uY��V�s~"�ܮ�
$argon2i$v=19$m=1024,t=2,p=2$NWZQS2Q3dE1ORndjaUdpWg$vOR3DBT+IhdAXIt7YUPDiExalf1lsMeIVe/zTZDDYfU
jutyujz0

jutyujz01#

为了从数据库中获得所需的内容,您需要在查询中输入两个内容:解密的用户名(用于对提交的用户名进行比较)和与提交的用户名进行比较。感谢@msbit朝着正确的方向启动了这个过程:

if ($stmt = mysqli_prepare($con, SELECT AES_DECRYPT(username, '$aesKey') FROM users WHERE AES_DECRYPT(username, '$aesKey') = ?){...

第一次解密, SELECT AES_DECRYPT(username, '$aesKey') as username ,将为您提供要在中使用的用户名标识符 $row['username'] 代码后面。
第二次, WHERE AES_DECRYPT(username, '$aesKey') = ? ,实际执行解密用户名与提交用户名的比较。
编辑
使用op的键和名称(与 TEXT 以下是insert语句:

INSERT INTO aes_test (username, encrypted) VALUES ('evan', AES_ENCRYPT('evan', '69552E16F55C3E88CF3CBC44EB5F71B24DD0CF5CB3A7C65EA97BC69224CF42F1'));

以下是针对特定用户的查询:

SELECT username, AES_DECRYPT(`encrypted`, '69552E16F55C3E88CF3CBC44EB5F71B24DD0CF5CB3A7C65EA97BC69224CF42F1') FROM aes_test WHERE AES_DECRYPT(`encrypted`, '69552E16F55C3E88CF3CBC44EB5F71B24DD0CF5CB3A7C65EA97BC69224CF42F1') = 'evan'

结果如下:
埃文|埃文

相关问题