pgsodium

表数据加密存储 TDE

概览

扩展包名版本分类许可证语言
pgsodium3.1.9SECBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
7020pgsodiumpgsodium
相关扩展pgsmcrypto pgcryptokey pgcrypto anon pg_tde sslutils faker
下游依赖supabase_vault

+fix missing pg17

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY3.1.91817161514pgsodium-
RPMPIGSTY3.1.91817161514pgsodium_$v-
DEBPIGSTY3.1.91817161514postgresql-$v-pgsodium-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
u22.x86_64
u22.aarch64
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
u24.x86_64
u24.aarch64
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9
PIGSTY 3.1.9

构建

您可以使用 pig build 命令构建 pgsodium 扩展的 RPM / DEB 包:

pig build pkg pgsodium         # 构建 RPM / DEB 包

安装

您可以直接安装 pgsodium 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

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 加密函数

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 – 较高权限,可以操作原始密钥

最后修改 2026-03-14: update extension metadata (953cbd0)