今天研究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'));。
- 这里的
sinmu就是我写的key_str,也就是我们代码中的密钥。 AES_ENCRYPT()就是mysql自带的加密函数hex()是将结果转为16进制
如果想要解密的话,建议使用这个sql语句:
SELECT cast(AES_DECRYPT(unhex('916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D'),'sinmu') AS CHAR);
- 同样的
sinmu为密钥 2.916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D这个长字符串是由上面加密得到的,他是一个16进制的结果,所以我们需要用unhex()来转为字符 3.AES_DECRYPT是数据库自带的解密函数 4. 最外层的case()函数将任何类型的值转换为具有指定类型的值。目标类型可以是以下类型之一:BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED。其语法是cast('1' as UNSIGNED)
SELECT hex(AES_ENCRYPT('中国人不骗中国人','sinmu'));
-- 916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D
SELECT cast(AES_DECRYPT(unhex('916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D'),'sinmu') AS CHAR);
-- 中国人不骗中国人
以上就是对于 mysql 的 AES 的加解密方式。