你听说过数据被盗吗?哎,这可不只是好莱坞大片里的情节。公司因为数据泄露损失了几百万美元,名声也像纸牌屋一样崩塌。为了不让这种事发生,数据必须得保护好。最强的办法之一——加密。
加密就是把数据变成“密文”,没有解密key根本看不懂。在PostgreSQL里有个超好用的扩展叫pgcrypto,它能让你加密数据变得很简单。
pgcrypto是PostgreSQL的一个扩展,提供了强大的数据加密、解密、哈希和随机数据生成工具。
pgcrypto的主要功能:
- 支持对称加密(一个key)和非对称加密(一对key:私钥和公钥)。
- 数据哈希校验(比如密码)。
- 生成随机数据,可以用来做token、key和密码。
下面是怎么在你的数据库里启用pgcrypto。如果你以前觉得魔法只有霍格沃茨的巫师才会,PostgreSQL会让你大开眼界。
-- 启用pgcrypto扩展
CREATE EXTENSION IF NOT EXISTS pgcrypto;
对称加密:让你的秘密安全
加密和解密的函数:
pgp_sym_encrypt(data, key)—— 用对称key加密数据。pgp_sym_decrypt(data, key)—— 用同一个key解密数据。
例子:加密一段普通文本
假设我们有个users表,里面有email字段,我们想把邮箱地址加密。
-- 创建users表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- 插入数据
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- 加密数据
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- 查看结果
SELECT * FROM users;
结果:email字段里现在存的是加密后的内容,看起来就是一堆乱码。
数据解密
需要还原数据时,用pgp_sym_decrypt函数就行。
-- 解密数据
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
注意:别在key上偷懒。像“123456”这种key就跟你给门上了锁又把门敞开一样。key一定要长、复杂。
数据哈希:密码保护加强版
把密码明文存数据库里就跟把日记本藏在合租房的枕头底下一样。别这么干!用哈希才对。
哈希函数: crypt(password, gen_salt('bf')) —— 用Blowfish算法给password生成哈希。
-- 密码哈希例子
SELECT crypt('my_password', gen_salt('bf'));
结果大概长这样:$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi。
验证密码也用同一个函数:
-- 验证密码
SELECT crypt('my_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
结果:true。
友情提示:千万别存明文密码。就算你觉得数据库再安全,也一定要用哈希。
非对称加密:两个key比一个key更安全
非对称加密用到两把key:
- 公钥(加密用)。
- 私钥(解密用)。
例子:用公钥加密
-- 生成一对key(简单起见用变量存)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'my_passphrase')
INTO public_key, private_key;
RAISE NOTICE 'Public Key: %', public_key;
RAISE NOTICE 'Private Key: %', private_key;
END $$;
非对称加密的应用
现在很多系统用非对称加密来传数据,比如SSL连接。
生成随机数据
要生成token或者随机key,可以用gen_random_uuid或者gen_random_bytes。
例子:
-- 生成随机UUID
SELECT gen_random_uuid();
-- 生成随机字节数组
SELECT gen_random_bytes(16);
这很适合用来生成唯一ID、访问token或者随机密码。
pgcrypto的使用场景
- 加密敏感数据:
- 信用卡号。
- 客户个人信息(比如地址、手机号)。
- 医疗记录。
密码哈希: 保证就算数据库管理员也看不到用户密码。
安全传输数据: 用非对称加密传递加密信息。
生成token: 给API用户生成认证token。
加密常见的坑
key放在容易拿到的地方。 千万别把加密key明文放数据库里。用专门的密钥管理工具。
key太弱。 key太短很容易被猜出来。
没必要也加密。 加密会让数据处理变慢。只在真的需要的时候用。
忘了用哪个key。 没有文档记录,最后数据都解不开了。
加密其实不难,逻辑上就是保护你的数据。把pgcrypto用到你的项目里,数据库就安全多了,也更符合现代安全标准。PostgreSQL已经给你准备好把数据变成铜墙铁壁的所有工具啦。
GO TO FULL VERSION