mysql的AES加解密--你学废了么

1,705 阅读2分钟

今天研究mysql的解密的时候发现数据入库之后可以自己加密,网上搜索了一下,数据库加密方式有这些

这里主要是说明 AES_DECRYPT()AES_ENCRYPT()两个函数的用法

AES_ENCRYPT()AES_DECRYPT() 使用官方的 AES(高级加密标准)算法(以前称为“ Rijndael”)实现数据的加密和解密。 AES 标准允许各种密钥长度。默认情况下,这些功能使用 128 位密钥长度实现 AES。可以使用 196 或 256 位的密钥长度,如下所述。密钥长度是性能和安全性之间的折衷。

AES_DECRYPT(str, key_str) -- 使用 AES 解密
AES_ENCRYPT(str, key_str) -- 使用 AES 加密

-- AES_ENCRYPT()使用密钥字符串 key_str 对字符串str进行加密,
--		并返回包含加密输出的二进制字符串。 
-- AES_DECRYPT()使用密钥字符串 key_str 解密加密的字符串 crypt_str 
-- 		并返回原始的纯文本字符串。如果任何一个函数参数均为NULL,则函数返回NULL。

假设我需要对下面这句话进行一个加密

中国人不骗中国人

那么他的sql语句就是 SELECT hex(AES_ENCRYPT('中国人不骗中国人','sinmu'));

  1. 这里的 sinmu 就是我写的key_str,也就是我们代码中的密钥。
  2. AES_ENCRYPT() 就是mysql自带的加密函数
  3. hex() 是将结果转为16进制

如果想要解密的话,建议使用这个sql语句:

SELECT cast(AES_DECRYPT(unhex('916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D'),'sinmu') AS CHAR);
  1. 同样的 sinmu 为密钥 2. 916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D 这个长字符串是由上面加密得到的,他是一个16进制的结果,所以我们需要用 unhex() 来转为字符 3. AES_DECRYPT 是数据库自带的解密函数 4. 最外层的 case() 函数将任何类型的值转换为具有指定类型的值。目标类型可以是以下类型之一:BINARYCHARDATEDATETIMETIMEDECIMALSIGNEDUNSIGNED。其语法是 cast('1' as UNSIGNED)
SELECT hex(AES_ENCRYPT('中国人不骗中国人','sinmu'));
-- 916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D

SELECT cast(AES_DECRYPT(unhex('916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D'),'sinmu') AS CHAR);
-- 中国人不骗中国人

以上就是对于 mysql 的 AES 的加解密方式。