如何在mysql中使用AES_ENCRYPT和AES_DECRYPT

PSR*_*PSR 22 mysql encryption

我创建了用户表

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;
Run Code Online (Sandbox Code Playgroud)

我插了一行:

INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010'));
Run Code Online (Sandbox Code Playgroud)

要选择我使用的这一行:

SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user;
Run Code Online (Sandbox Code Playgroud)

我得到以下结果.我需要做什么才能看到我的数据.没有数据对我来说是可见的.

我无法看到我的数据

Joh*_*Woo 34

根据手册:

AES_ENCRYPT()加密字符串并返回二进制字符串. AES_DECRYPT()解密加密的字符串并返回原始字符串.

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

SELECT *, 
       CAST(AES_DECRYPT(first_name, 'usa2010') AS CHAR(50)) first_name_decrypt 
FROM   user
Run Code Online (Sandbox Code Playgroud)

并使用first_name_decrypt而不是first_name.

  • 注意:“(50)”可能适用于此示例,但对于其他示例来说不够长。 (2认同)

小智 13

从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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

CAST

正如您所看到的,在命令行中使用cast会慢一点.但是我注意到如果你使用像phpmyadmin这样的工具,那么你需要使用CAST,否则结果会出错.