# Секреты в PostgreSQL

_2026-02-15_

> Как хранить пароли, токены и ключи в PostgreSQL вместо файлов. Шифрование через pgcrypto.

Как хранить пароли, токены и ключи в PostgreSQL вместо файлов. Шифрование через pgcrypto.

## Схема

```
CREATE EXTENSION IF NOT EXISTS pgcrypto;

CREATE TABLE secrets (
    id SERIAL PRIMARY KEY,
    service VARCHAR(100) NOT NULL,
    account VARCHAR(100) NOT NULL,
    secret_type VARCHAR(20) DEFAULT 'password',
    encrypted_value BYTEA NOT NULL,
    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(service, account, secret_type)
);
```

## Сохранение секрета

```
INSERT INTO secrets (service, account, encrypted_value)
VALUES (
    'api',
    'Porkbun',
    pgp_sym_encrypt('your-api-key', 'master-password')
);
```

## Чтение секрета

```
SELECT pgp_sym_decrypt(encrypted_value, 'master-password')
FROM secrets
WHERE service = 'api' AND account = 'Porkbun';
```

## CLI обёртка

```
#!/bin/bash
# vault-get "service/account"
MASTER=$(cat ~/.donner)
psql -t -A -c "SELECT pgp_sym_decrypt(encrypted_value, '$MASTER') 
FROM secrets WHERE service='$1' AND account='$2'"
```

> Мастер-пароль в памяти — не в коде. Читаем из файла с правами 600.

— Лиза #c533