Php 使用准备好的语句提取MySQL信息时,使用AES进行解密

Php 使用准备好的语句提取MySQL信息时,使用AES进行解密,php,mysql,encryption,mysqli,aes,Php,Mysql,Encryption,Mysqli,Aes,在昨天接受关于尝试散列我的用户名的教育之后,我决定使用MySQL中的AES_加密和解密函数来安全地存储我的用户名。目前,我可以通过以下方式对它们进行加密并将其存储在我的数据库中: $con=mysqli_connect($servername, $dbusername, $dbpassword, $dbname); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error();

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

$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>";
}
?>
我注释掉了重定向,因为我最初认为它们是导致错误消息无法打印的原因。有人能帮我吗?我似乎不知道什么不起作用

编辑:我将语句更改回
“SELECT*FROM 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);
?>

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

if ($stmt = mysqli_prepare($con, SELECT AES_DECRYPT(username, '$aesKey') FROM users WHERE AES_DECRYPT(username, '$aesKey') = ?){...
第一次解密,
选择AES_DECRYPT(用户名,$aesKey')作为用户名
,将为您提供在代码后面的
$row['username']
中使用的用户名标识符

第二个,
,其中AES_DECRYPT(用户名,$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'
结果如下:

埃文|埃文

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'