MySQL
在MySQL里,可以使用AES_ENCRYPT和AES_DECRYPT来实现数据的加解密。
如下例子:
代码语言:txt复制对于原始是明文的情况,可以使用下面的方法 :
-- 原始内容如下:
[test]> select * from t1;
---- -------- ---------------------
| id | remark | create_time |
---- -------- ---------------------
| 7 | aaabbb | 2024-09-26 11:08:23 |
| 8 | aaa | 2024-09-26 11:07:22 |
| 9 | aaabbb | 2024-09-26 11:07:30 |
---- -------- ---------------------
3 rows in set (0.00 sec)
如果直接使用AES_ENCRYPT会发现数据是乱码的
[test]> select id,AES_ENCRYPT(remark, 'encryption key'),create_time from t1;
---- --------------------------------------- ---------------------
| id | AES_ENCRYPT(remark, 'encryption key') | create_time |
---- --------------------------------------- ---------------------
| 7 | u�?�x�U��݄u3� | 2024-09-26 11:08:23 |
| 8 | ���P����/Y����_ | 2024-09-26 11:07:22 |
| 9 | u�?�x�U��݄u3� | 2024-09-26 11:07:30 |
---- --------------------------------------- ---------------------
3 rows in set (0.00 sec)
[test]> select id,remark,TO_BASE64(AES_ENCRYPT(remark, 'encryption key')) as remark_encr,create_time from t1 ;
---- -------- -------------------------- ---------------------
| id | remark | remark_encr | create_time |
---- -------- -------------------------- ---------------------
| 7 | aaabbb | daYVP8d44FUY JTdhHUzyg== | 2024-09-26 11:08:23 |
| 8 | aaa | hIzbFlCSpcfJL1m58dvnXw== | 2024-09-26 11:07:22 |
| 9 | aaabbb | daYVP8d44FUY JTdhHUzyg== | 2024-09-26 11:07:30 |
---- -------- -------------------------- ---------------------
3 rows in set (0.00 sec)
解密
create table t1_encr select id,remark,TO_BASE64(AES_ENCRYPT(remark, 'encryption key')) as remark_encr,create_time from t1 ;
[test]> SELECT id,CAST(AES_DECRYPT(FROM_BASE64(remark_encr), 'encryption key') AS CHAR) AS remark,create_time FROM t1_encr;
---- ----------- ---------------------
| id | remark | create_time |
---- ----------- ---------------------
| 7 | aaa | 2024-01-01 00:02:01 |
| 8 | aaabbb | 2024-01-01 00:02:01 |
| 9 | aaabbbccc | 2024-01-01 00:02:01 |
---- ----------- ---------------------
3 rows in set (0.00 sec)
注意: 上面的这种加解密有个缺点,只要DBA把慢查询的阈值调低(或者临时开启general_log) 即可抓取到秘钥内容,DBA有了秘钥后,就可以解出明文数据。
PG
在PG中,可以使用pgcrypto这个扩展来实现AES加解密。如下例子:
代码语言:txt复制-- 安装扩展
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 加密
SELECT pgp_sym_encrypt('Hello, World!', 'my_secret_key', 'cipher-algo=aes256');
-- 解密
SELECT pgp_sym_decrypt('U2FsdGVkX1...', 'my_secret_key', 'cipher-algo=aes256');
注意
基于数据库函数或者扩展的加解密,实际上对安全需求高的场景下是不推荐使用的。
更推荐使用:
1、专用的秘钥管理器(例如云厂商的kms服务、或者开源的vault)
2、自研加解密的基础服务