如何在mysql中使用AES_ENCRYPT和AES_DECRYPT?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (292)

我创建了user表

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;

我得到以下结果。我需要做的是看我的数据。我看不见任何数据。

提问于
用户回答回答于

从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,否则结果将是错误的。

用户回答回答于

根据文档:

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

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

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

并用first_name_decrypt而不是first_name

扫码关注云+社区

领取腾讯云代金券