24

我创建了用户表

CREATE  TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`first_name` VARBINARY(100) NULL ,
`address` VARBINARY(200) NOT NULL ,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

我插入了一行:

INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010'));

要选择这一行,我使用:

SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user;

我得到以下结果。我需要做什么来查看我的数据。我看不到任何数据。

我无法查看我的数据

4

4 回答 4

38

根据手册:

AES_ENCRYPT() 加密一个字符串并返回一个二进制字符串。 AES_DECRYPT() 解密加密字符串并返回原始字符串

我不知道为什么在你的情况下它仍然返回一个二进制字符串。无论如何,试试这个:

SELECT *, 
       CAST(AES_DECRYPT(first_name, 'usa2010') AS CHAR(50)) first_name_decrypt 
FROM   user

并使用first_name_decrypt而不是first_name.

于 2013-05-15T03:51:00.327 回答
16

从 mysql 命令行客户端不需要使用CAST

mysql> SELECT AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc');

+-----------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') |
+-----------------------------------------------+
| admin                                         |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50));

+------------------------------------------------------------------+
| CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50)) |
+------------------------------------------------------------------+
| admin                                                            |
+------------------------------------------------------------------+
1 row in set (0.02 sec)

如您所见,在命令行中使用 cast 有点慢。但是我注意到如果你使用一些工具,比如phpmyadmin,那么你需要使用CAST,否则结果会出错。

于 2015-07-10T11:45:39.027 回答
0

我遇到了同样的问题,原来我在加密数据时将列数据类型设置为 VARCHAR,当我切换到 MEDIUMTEXT 时,除了 BLOB 之外,它不会返回任何其他内容。

引用 dev.mysql 的一部分:

许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有 VARBINARY 或 BLOB 二进制字符串数据类型的列。这将避免尾随空格删除或字符集转换可能会更改数据值的潜在问题,例如,如果您使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)可能会出现这些问题。

切换到支持的列类型对我有用。

于 2020-08-27T13:18:18.420 回答
-3
if (isset($_POST['user_name']) and isset($_POST['user_password'])){

$user_name = $_POST['user_name'];
$user_password = $_POST['user_password'];


$query = "SELECT * FROM `user_tbl` WHERE user_name='$user_name' and AES_DECRYPT(user_password , '@ert') = '$user_password'";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);
于 2018-05-23T10:11:38.093 回答