在MySQL里,可以使用AES_ENCRYPT和AES_DECRYPT来实现数据的加解密。
如下例子:
对于原始是明文的情况,可以使用下面的方法 :
-- 原始内容如下:
[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中,可以使用pgcrypto这个扩展来实现AES加解密。如下例子:
-- 安装扩展
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、自研加解密的基础服务
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。