pgsodium
表数据加密存储 TDE
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pgsodium | 3.1.9 | SEC | BSD 3-Clause | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 7020 | pgsodium | 否 | 是 | 是 | 是 | 否 | 否 | pgsodium |
| 相关扩展 | pgsmcrypto pgcryptokey pgcrypto anon pg_tde sslutils faker |
|---|---|
| 下游依赖 | supabase_vault |
+fix missing pg17
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 3.1.9 | 1817161514 | pgsodium | - |
| RPM | PIGSTY | 3.1.9 | 1817161514 | pgsodium_$v | - |
| DEB | PIGSTY | 3.1.9 | 1817161514 | postgresql-$v-pgsodium | - |
构建
您可以使用 pig build 命令构建 pgsodium 扩展的 RPM / DEB 包:
pig build pkg pgsodium # 构建 RPM / DEB 包
安装
您可以直接安装 pgsodium 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install pgsodium; # 当前活跃 PG 版本安装
pig ext install -y pgsodium -v 18 # PG 18
pig ext install -y pgsodium -v 17 # PG 17
pig ext install -y pgsodium -v 16 # PG 16
pig ext install -y pgsodium -v 15 # PG 15
pig ext install -y pgsodium -v 14 # PG 14
dnf install -y pgsodium_18 # PG 18
dnf install -y pgsodium_17 # PG 17
dnf install -y pgsodium_16 # PG 16
dnf install -y pgsodium_15 # PG 15
dnf install -y pgsodium_14 # PG 14
apt install -y postgresql-18-pgsodium # PG 18
apt install -y postgresql-17-pgsodium # PG 17
apt install -y postgresql-16-pgsodium # PG 16
apt install -y postgresql-15-pgsodium # PG 15
apt install -y postgresql-14-pgsodium # PG 14
预加载配置:
shared_preload_libraries = 'pgsodium';
创建扩展:
CREATE EXTENSION pgsodium;
用法
pgsodium 是一个使用 libsodium 库的 PostgreSQL 加密扩展。它提供了 libsodium 的直接 SQL 接口、服务器管理的密钥派生和透明列加密(TCE)。
CREATE EXTENSION pgsodium;
生成随机数据
SELECT pgsodium.randombytes_random();
SELECT pgsodium.randombytes_buf(16); -- 16个随机字节
SELECT pgsodium.randombytes_uniform(100); -- 0-99之间的随机整数
对称密钥加密(带认证)
SELECT * FROM pgsodium.crypto_secretbox_keygen();
SELECT pgsodium.crypto_secretbox('message', nonce, key);
SELECT pgsodium.crypto_secretbox_open(ciphertext, nonce, key);
公钥加密
SELECT * FROM pgsodium.crypto_box_new_keypair();
SELECT pgsodium.crypto_box('message', nonce, public_key, secret_key);
SELECT pgsodium.crypto_box_open(ciphertext, nonce, public_key, secret_key);
公钥签名
SELECT * FROM pgsodium.crypto_sign_new_keypair();
SELECT pgsodium.crypto_sign('message', secret_key);
SELECT pgsodium.crypto_sign_open(signed_message, public_key);
密码哈希
SELECT pgsodium.crypto_pwhash_str('my_password');
SELECT pgsodium.crypto_pwhash_str_verify(hash, 'my_password');
哈希
SELECT pgsodium.crypto_generichash('data');
SELECT pgsodium.crypto_shorthash('data', key);
服务器密钥管理
pgsodium 可以将外部根密钥加载到内存中,该密钥永远无法通过 SQL 访问。子密钥通过密钥 ID 派生:
SELECT * FROM pgsodium.create_key();
-- 返回一个 UUID 密钥 ID,用于 TCE 或加密函数
透明列加密(TCE)
CREATE TABLE private.users (
id bigserial PRIMARY KEY,
secret text
);
SECURITY LABEL FOR pgsodium ON COLUMN private.users.secret
IS 'ENCRYPT WITH KEY ID dfc44293-fa78-4a1a-9ef9-7e600e63e101';
加密数据存储在磁盘上,通过生成的视图自动解密。
安全角色
pgsodium_keyiduser– 较低权限,只能通过 UUID 访问密钥pgsodium_keymaker– 较高权限,可以操作原始密钥