╔════════════════════════════════════════════════════════════════╗
║ ║
║ 🔐 POSTGRESQL DATABASE WITH ACID COMPLIANCE 🔐 ║
║ ║
║ Enterprise-Grade | Cryptographically Secure | Scalable ║
║ ║
╚════════════════════════════════════════════════════════════════╝
KeyBridge uses PostgreSQL 16 as its primary database, designed with military-grade security, full ACID compliance, and optimized for high-performance cryptographic operations.
flowchart TD
A[Client Application] -->|TLS 1.3| B[Connection Pool]
B --> C[(PostgreSQL 16)]
C --> D[Users Table]
C --> E[Sessions Table]
C --> F[Files Table]
C --> G[Audit Logs]
C --> H[Verification Records]
C --> I[Row-Level Security]
C --> J[ACID Transactions]
C --> K[Encryption at Rest]
C --> L[WAL Logging]
style A fill:#e1f5ff,stroke:#333,stroke-width:2px
style C fill:#ff6b6b,stroke:#333,stroke-width:2px
style I fill:#51cf66,stroke:#333,stroke-width:2px
style J fill:#51cf66,stroke:#333,stroke-width:2px
style K fill:#51cf66,stroke:#333,stroke-width:2px
style L fill:#51cf66,stroke:#333,stroke-width:2px
┌─────────────────────────────────────────────────────────────────────┐
│ 📊 DATABASE SCHEMA │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 👤 USERS 🔗 SESSIONS │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ id (UUID) │◄───────────┤ sender_id (FK) │ │
│ │ email │ │ receiver_id (FK) │ │
│ │ password_hash│ │ session_id (UUID)│ │
│ │ role │ │ status │ │
│ │ is_active │ │ encrypted_key │ │
│ │ created_at │ │ expires_at │ │
│ │ last_login_at│ │ metadata (JSONB) │ │
│ └──────────────┘ └──────────────────┘ │
│ │ │ │
│ │ ┌────────┴────────┐ │
│ │ │ │ │
│ │ 📁 FILES 📋 AUDIT_LOGS │
│ │ ┌──────────┐ ┌──────────────┐ │
│ │ │ file_id │ │ action │ │
│ │ │ session_id│ │ user_id │ │
│ │ │ encrypted│ │ resource_type│ │
│ │ │ size │ │ timestamp │ │
│ │ │ uploaded │ │ ip_address │ │
│ │ └──────────┘ └──────────────┘ │
│ │ │
│ │ 🔐 VERIFICATION_RECORDS │
│ └──────────────►┌─────────────────────┐ │
│ │ session_id │ │
│ │ vrh_hash │ │
│ │ sender_public_key │ │
│ │ receiver_public_key │ │
│ │ is_compromised │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
BEGIN TRANSACTION;
-- Step 1: Create Session
INSERT INTO sessions (...);
-- Step 2: Upload Files
INSERT INTO files (...);
-- Step 3: Log Audit
INSERT INTO audit_logs (...);
COMMIT;
-- All succeed or all rollbackFeatures:
|
-- Email validation
CHECK (email ~* '^[A-Za-z0-9._%+-]+@...')
-- Logical constraints
CHECK (created_at <= updated_at)
CHECK (sender_id != receiver_id)
-- Status transitions
CHECK (
(status = 'PENDING' AND activated_at IS NULL)
OR (status = 'ACTIVE' AND activated_at IS NOT NULL)
)Features:
|
-- Row-level locking
SELECT * FROM sessions
WHERE session_id = $1
FOR UPDATE;
-- Isolation levels
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE;Features:
|
Features:
|
CREATE TABLE users (
-- Identity
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
-- Authentication
password_hash TEXT NOT NULL, -- Argon2id hashed
-- Profile
first_name VARCHAR(100),
last_name VARCHAR(100),
profile_picture_url TEXT,
-- Access Control
role user_role DEFAULT 'NORMAL_USER',
is_active BOOLEAN DEFAULT TRUE,
email_verified BOOLEAN DEFAULT FALSE,
-- Tracking
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
last_login_at TIMESTAMPTZ,
-- Constraints
CONSTRAINT email_lowercase CHECK (email = LOWER(email)),
CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@...'),
CONSTRAINT password_strong CHECK (LENGTH(password_hash) >= 60)
);Key Features:
- 🔑 UUID primary keys for security
- 📧 Email normalization and validation
- 🔐 Argon2id password hashing
- ⏰ Automatic timestamp tracking
- 🎭 Role-based access control
CREATE TABLE sessions (
-- Identity
session_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Relationships
sender_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
receiver_id UUID REFERENCES users(id) ON DELETE CASCADE,
sender_email VARCHAR(255),
receiver_email VARCHAR(255),
-- Session Info
status session_status DEFAULT 'PENDING',
approach VARCHAR(20) DEFAULT 'oob', -- 'oob' or 'server'
message TEXT,
-- File Details
file_name VARCHAR(500),
file_size BIGINT,
-- Cryptography
metadata JSONB, -- Contains encrypted keys, shares
-- Timestamps
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
activated_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
expires_at TIMESTAMPTZ NOT NULL,
-- Constraints
CONSTRAINT sender_not_receiver CHECK (sender_id != receiver_id),
CONSTRAINT expires_after_creation CHECK (expires_at > created_at),
CONSTRAINT valid_status_transition CHECK (...)
);Session Status Flow:
PENDING → ACTIVE → COMPLETED
↓ ↓ ↓
EXPIRED FAILED SUSPENDED
CREATE TABLE files (
-- Identity
file_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
session_id UUID NOT NULL REFERENCES sessions ON DELETE CASCADE,
-- File Data
encrypted_content BYTEA NOT NULL, -- AES-256-GCM encrypted
encrypted_key TEXT NOT NULL,
size BIGINT NOT NULL,
-- Metadata
original_name VARCHAR(500),
mime_type VARCHAR(100),
hash_sha256 VARCHAR(64),
-- Tracking
uploaded_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
-- Constraints
CONSTRAINT size_positive CHECK (size > 0),
CONSTRAINT key_not_empty CHECK (LENGTH(encrypted_key) > 0)
);Encryption Details:
- 🔐 Algorithm: AES-256-GCM
- 🔑 Key Size: 256 bits
- 🎲 IV: 96 bits (unique per file)
- ✅ Authentication: Built-in GMAC
CREATE TABLE verification_records (
-- Identity
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
session_id UUID UNIQUE REFERENCES sessions,
-- Cryptographic Hashes
vrh_hash TEXT NOT NULL, -- Virtual Rendezvous Hash
sender_public_key TEXT NOT NULL,
receiver_public_key TEXT,
-- MITM Detection
is_compromised BOOLEAN DEFAULT FALSE,
failed_validations INTEGER DEFAULT 0,
-- Timestamps
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
last_verified_at TIMESTAMPTZ,
-- Constraints
CONSTRAINT vrh_not_empty CHECK (LENGTH(vrh_hash) > 0),
CONSTRAINT validations_positive CHECK (failed_validations >= 0)
);MITM Detection Mechanism:
Step 1: Generate VRH Hash (sender + receiver keys)
Step 2: Store in database
Step 3: Validate on every access
Step 4: Flag if hash mismatch
Step 5: Alert admin + log audit trail
CREATE TABLE audit_logs (
-- Identity
id BIGSERIAL PRIMARY KEY,
-- Event Details
action VARCHAR(100) NOT NULL,
resource_type VARCHAR(50),
resource_id TEXT,
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
-- Context
details JSONB,
ip_address INET,
user_agent TEXT,
-- Timestamp
timestamp TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
-- Constraints
CONSTRAINT timestamp_recent CHECK (
timestamp >= '2025-01-01' AND
timestamp <= CURRENT_TIMESTAMP + INTERVAL '1 minute'
)
);Tracked Actions:
- 🔐
USER_LOGIN/USER_LOGOUT - 📝
SESSION_CREATED/SESSION_JOINED/SESSION_COMPLETED - 📁
FILE_UPLOADED/FILE_DOWNLOADED ⚠️ UNAUTHORIZED_ACCESS/MITM_DETECTED- 👤
USER_CREATED/USER_DELETED
-- Unique Indexes (Enforcing Constraints)
CREATE UNIQUE INDEX idx_users_email ON users(LOWER(email));
CREATE UNIQUE INDEX idx_sessions_id ON sessions(session_id);
-- Performance Indexes
CREATE INDEX idx_sessions_active ON sessions(status)
WHERE status IN ('PENDING', 'ACTIVE');
CREATE INDEX idx_sessions_expires ON sessions(expires_at)
WHERE status IN ('PENDING', 'ACTIVE');
CREATE INDEX idx_audit_timestamp ON audit_logs(timestamp DESC);
-- Composite Indexes
CREATE INDEX idx_sessions_user_status ON sessions(sender_id, receiver_id, status);
CREATE INDEX idx_files_session ON files(session_id, uploaded_at);Index Strategy:
- ✅ Unique indexes on frequently queried columns
- ✅ Partial indexes for active sessions (reduces size)
- ✅ Descending indexes for recent-first queries
- ✅ Composite indexes for multi-column queries
# psycopg2 Connection Pool
connection_pool = SimpleConnectionPool(
minconn=1, # Minimum connections
maxconn=10, # Maximum connections
dsn=database_url
)Benefits:
- ⚡ Reuse existing connections
- 🎯 Reduce connection overhead
- 📈 Handle concurrent requests
- 🛡️ Prevent connection exhaustion
┌─────────────────────────────────────────┐
│ Data Storage Layers │
├─────────────────────────────────────────┤
│ │
│ Application Layer: AES-256-GCM │
│ ↓ │
│ PostgreSQL Layer: Transparent DE │
│ ↓ │
│ Filesystem Layer: LUKS/BitLocker │
│ ↓ │
│ Hardware Layer: SED (Self-Encrypting) │
│ │
└─────────────────────────────────────────┘
-- Enable RLS on sensitive tables
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
-- Policy: Users can only see their own data
CREATE POLICY user_self_access ON users
FOR SELECT
USING (id = current_user_id());
-- Policy: Admins can see all
CREATE POLICY admin_full_access ON users
FOR ALL
USING (is_admin());-- Check active connections
SELECT count(*) FROM pg_stat_activity;
-- Check database size
SELECT pg_database_size(current_database());
-- Check table sizes
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename))
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- Check index usage
SELECT
schemaname, tablename, indexname,
idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;-- Slow queries
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
-- Cache hit ratio
SELECT
sum(heap_blks_read) as heap_read,
sum(heap_blks_hit) as heap_hit,
sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM pg_statio_user_tables;# Full database backup
pg_dump keybridge_db > backup_$(date +%Y%m%d).sql
# Compressed backup
pg_dump keybridge_db | gzip > backup_$(date +%Y%m%d).sql.gz
# Custom format (recommended)
pg_dump -Fc keybridge_db > backup_$(date +%Y%m%d).dump
# Restore from backup
pg_restore -d keybridge_db backup_20260104.dump1. Enable WAL archiving in postgresql.conf
2. Configure archive_command
3. Take base backup
4. Archive WAL segments continuously
5. Restore to any point in time
All schema files are located in sql/schema/:
sql/schema/
├── 01_initialize_database.sql # Database & extensions
├── 02_create_core_tables.sql # Users, OTP codes
├── 03_create_session_tables.sql # Sessions, files
├── 04_create_audit_tables.sql # Audit logs
├── 05_create_indexes.sql # Performance indexes
├── 06_create_functions.sql # Stored procedures
├── 07_create_triggers.sql # Automatic updates
├── 08_create_views.sql # Reporting views
├── 09_insert_seed_data.sql # Initial data
└── 10_acid_compliance.sql # ACID enhancements
# Ubuntu/Debian
sudo apt update
sudo apt install postgresql-16 postgresql-contrib
# macOS (Homebrew)
brew install postgresql@16
# Windows
# Download from https://www.postgresql.org/download/windows/# Connect to PostgreSQL
sudo -u postgres psql
# Create database
CREATE DATABASE keybridge_db;
# Create user
CREATE USER keybridge_user WITH PASSWORD 'secure_password';
# Grant privileges
GRANT ALL PRIVILEGES ON DATABASE keybridge_db TO keybridge_user;# Execute all schema files in order
cd sql/schema
psql -U keybridge_user -d keybridge_db -f 01_initialize_database.sql
psql -U keybridge_user -d keybridge_db -f 02_create_core_tables.sql
psql -U keybridge_user -d keybridge_db -f 03_create_session_tables.sql
# ... continue for all files# .env file
DB_URL=postgresql://keybridge_user:secure_password@localhost:5432/keybridge_db
DB_POOL_MIN=1
DB_POOL_MAX=10- ✅ Always use transactions for multi-step operations
- ✅ Use prepared statements to prevent SQL injection
- ✅ Index frequently queried columns
- ✅ Monitor slow queries and optimize
- ✅ Regular backups (daily minimum)
- ✅ Use connection pooling
- ✅ Enable query logging for debugging
- ✅ Validate data before insertion
- ❌ Never store passwords in plain text
- ❌ Don't use SELECT * in production
- ❌ Avoid N+1 query problems
- ❌ Don't skip foreign key constraints
- ❌ Never commit secrets to version control
- ❌ Don't run migrations without backups
- ❌ Avoid long-running transactions
- ❌ Don't ignore database logs
- 📖 PostgreSQL Official Documentation
- 🎓 ACID Compliance Guide
- 🔐 Database Security Best Practices
- 📊 PostgreSQL Performance Tuning
- 🛡️ SQL Injection Prevention
🎉 Database Architecture Complete!