今天研究mysql的解密的时候发现数据入库之后可以自己加密,网上搜索了一下,数据库加密方式有这些。
这里主要是说明 AES_DECRYPT()
和 AES_ENCRYPT()
两个函数的用法
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
为密钥 916B95B090DD381D4618729A9D080547764C508AC2DD0C2DBE237464ACE3CB7D
这个长字符串是由上面加密得到的,他是一个16进制的结果,所以我们需要用unhex()
来转为字符AES_DECRYPT
是数据库自带的解密函数- 最外层的
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);
-- 中国人不骗中国人