CodeGym /课程 /SQL SELF /pgcrypto数据加密入门

pgcrypto数据加密入门

SQL SELF
第 48 级 , 课程 1
可用

你听说过数据被盗吗?哎,这可不只是好莱坞大片里的情节。公司因为数据泄露损失了几百万美元,名声也像纸牌屋一样崩塌。为了不让这种事发生,数据必须得保护好。最强的办法之一——加密。

加密就是把数据变成“密文”,没有解密key根本看不懂。在PostgreSQL里有个超好用的扩展叫pgcrypto,它能让你加密数据变得很简单。

pgcrypto是PostgreSQL的一个扩展,提供了强大的数据加密、解密、哈希和随机数据生成工具。

pgcrypto的主要功能:

  1. 支持对称加密(一个key)和非对称加密(一对key:私钥和公钥)。
  2. 数据哈希校验(比如密码)。
  3. 生成随机数据,可以用来做token、key和密码。

下面是怎么在你的数据库里启用pgcrypto。如果你以前觉得魔法只有霍格沃茨的巫师才会,PostgreSQL会让你大开眼界。

-- 启用pgcrypto扩展
CREATE EXTENSION IF NOT EXISTS pgcrypto;

对称加密:让你的秘密安全

加密和解密的函数:

  1. pgp_sym_encrypt(data, key) —— 用对称key加密数据。
  2. 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:

  1. 公钥(加密用)。
  2. 私钥(解密用)。

例子:用公钥加密

-- 生成一对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的使用场景

  1. 加密敏感数据:
  • 信用卡号。
  • 客户个人信息(比如地址、手机号)。
  • 医疗记录。
  1. 密码哈希: 保证就算数据库管理员也看不到用户密码。

  2. 安全传输数据: 用非对称加密传递加密信息。

  3. 生成token: 给API用户生成认证token。

加密常见的坑

key放在容易拿到的地方。 千万别把加密key明文放数据库里。用专门的密钥管理工具。

key太弱。 key太短很容易被猜出来。

没必要也加密。 加密会让数据处理变慢。只在真的需要的时候用。

忘了用哪个key。 没有文档记录,最后数据都解不开了。

加密其实不难,逻辑上就是保护你的数据。把pgcrypto用到你的项目里,数据库就安全多了,也更符合现代安全标准。PostgreSQL已经给你准备好把数据变成铜墙铁壁的所有工具啦。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION