Secrets Management: HashiCorp Vault vs Infisical vs Doppler

Compare HashiCorp Vault, Infisical, and Doppler for secrets management. Self-hosted vs cloud, developer experience, Kubernetes integration, and rotation...

Y
Yash Pritwani
14 min read

Why Secrets Management Matters

If your secrets are in .env files committed to Git, environment variables on a shared server, or a shared 1Password vault, you have a secrets management problem. Secrets (API keys, database passwords, TLS certificates) need to be:

<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 150" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="150" rx="12" fill="#1a1a2e"/><rect x="30" y="40" width="100" height="55" rx="6" fill="none" stroke="#3b82f6" stroke-width="1.5"/><text x="80" y="60" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="monospace">Hello World</text><text x="80" y="80" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">Plaintext</text><rect x="175" y="30" width="90" height="75" rx="8" fill="#6366f1" opacity="0.85"/><text x="220" y="55" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Encrypt</text><text x="220" y="72" text-anchor="middle" fill="#ffffff" font-size="9" font-family="system-ui">AES-256</text><text x="220" y="92" text-anchor="middle" fill="#f59e0b" font-size="20" font-family="system-ui">&#x1f511;</text><rect x="310" y="40" width="100" height="55" rx="6" fill="none" stroke="#a855f7" stroke-width="1.5"/><text x="360" y="60" text-anchor="middle" fill="#a855f7" font-size="10" font-family="monospace">x8f2...k9z</text><text x="360" y="80" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">Ciphertext</text><rect x="455" y="30" width="90" height="75" rx="8" fill="#2dd4bf" opacity="0.85"/><text x="500" y="55" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Decrypt</text><text x="500" y="72" text-anchor="middle" fill="#1a1a2e" font-size="9" font-family="system-ui">AES-256</text><text x="500" y="92" text-anchor="middle" fill="#f59e0b" font-size="20" font-family="system-ui">&#x1f511;</text><defs><marker id="arrow6" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6" fill="#e2e8f0"/></marker></defs><line x1="132" y1="67" x2="173" y2="67" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow6)"/><line x1="267" y1="67" x2="308" y2="67" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow6)"/><line x1="412" y1="67" x2="453" y2="67" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow6)"/><text x="300" y="130" text-anchor="middle" fill="#94a3b8" font-size="10" font-family="system-ui">Symmetric Encryption: same key encrypts and decrypts</text></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Encryption transforms readable plaintext into unreadable ciphertext, reversible only with the correct key.</p></div>

Centralized: One source of truth, not scattered across servers and repos
Encrypted: At rest and in transit
Audited: Every access logged with who, what, when
Rotatable: Change a secret without redeploying services
Access-controlled: Each service gets only the secrets it needs

HashiCorp Vault: The Enterprise Standard

Vault is the most feature-rich secrets management tool. It supports secret engines (KV, databases, PKI, SSH, cloud IAM), dynamic secrets, and encryption-as-a-service.

# Start Vault in dev mode (for learning)
vault server -dev

# Store a secret
vault kv put secret/myapp/database \
  username=dbadmin \
  password=supersecret \
  host=postgres.internal

# Read a secret
vault kv get secret/myapp/database

# Dynamic database credentials (auto-rotated)
vault write database/config/postgres \
  plugin_name=postgresql-database-plugin \
  connection_url="postgresql://{{username}}:{{password}}@postgres:5432/app" \
  allowed_roles="readonly,readwrite" \
  username="vault" \
  password="vault-password"

vault write database/roles/readonly \
  db_name=postgres \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
  default_ttl="1h" \
  max_ttl="24h"

# Get dynamic credentials (new user created, auto-expires)
vault read database/creds/readonly
# username: v-token-readonly-abc123
# password: A1B2C3D4E5
# ttl: 1h

Vault with Kubernetes:

# Vault Agent injector - automatically injects secrets into pods
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/agent-inject-secret-db: "secret/data/myapp/database"
        vault.hashicorp.com/agent-inject-template-db: |
          {{- with secret "secret/data/myapp/database" -}}
          DB_HOST={{ .Data.data.host }}
          DB_USER={{ .Data.data.username }}
          DB_PASS={{ .Data.data.password }}
          {{- end }}
        vault.hashicorp.com/role: "myapp"
    spec:
      containers:
        - name: app
          image: my-app:latest
          command: ["sh", "-c", "source /vault/secrets/db && node server.js"]

Infisical: The Developer-Friendly Alternative

Infisical is an open-source secrets management platform designed for developer experience. It has a clean UI, native integrations, and is much simpler to operate than Vault.

At TechSaaS, we run Infisical at secrets.techsaas.cloud for our own secrets management.

# Install Infisical CLI
curl -1sLf https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh | sudo bash
sudo apt install infisical

# Login
infisical login

# Pull secrets into your environment
infisical run -- docker compose up -d

# Pull secrets for a specific environment
infisical export --env=production --format=dotenv > .env

# Inject secrets into any command
infisical run --env=production -- npm start

Infisical with Docker Compose:

# docker-compose.yml
services:
  my-app:
    image: my-app:latest
    environment:
      INFISICAL_TOKEN: "st.xxxx.yyyy"
    command: >
      sh -c "infisical run --env=production -- node server.js"

Infisical secret referencing — reference secrets across projects:

# In Infisical dashboard
DB_HOST = postgres.internal
DB_PORT = 5432
DB_NAME = myapp
DB_URL = postgresql://admin:password@{DB_HOST}:{DB_PORT}/{DB_NAME}

<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 220" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="220" rx="12" fill="#1a1a2e"/><path d="M300,25 L380,55 L380,120 Q380,170 300,195 Q220,170 220,120 L220,55 Z" fill="none" stroke="#6366f1" stroke-width="2.5"/><path d="M300,40 L365,65 L365,118 Q365,160 300,180 Q235,160 235,118 L235,65 Z" fill="#6366f1" opacity="0.15"/><rect x="280" y="95" width="40" height="30" rx="4" fill="#6366f1" opacity="0.9"/><path d="M288,95 L288,82 Q288,72 300,72 Q312,72 312,82 L312,95" fill="none" stroke="#6366f1" stroke-width="2.5"/><circle cx="300" cy="110" r="4" fill="#ffffff"/><text x="90" y="60" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="system-ui">Firewall</text><line x1="130" y1="57" x2="218" y2="57" stroke="#3b82f6" stroke-width="1" stroke-dasharray="3,3"/><text x="90" y="100" text-anchor="middle" fill="#a855f7" font-size="10" font-family="system-ui">WAF</text><line x1="110" y1="97" x2="220" y2="85" stroke="#a855f7" stroke-width="1" stroke-dasharray="3,3"/><text x="90" y="140" text-anchor="middle" fill="#2dd4bf" font-size="10" font-family="system-ui">SSO / MFA</text><line x1="130" y1="137" x2="222" y2="120" stroke="#2dd4bf" stroke-width="1" stroke-dasharray="3,3"/><text x="510" y="60" text-anchor="middle" fill="#f59e0b" font-size="10" font-family="system-ui">TLS/SSL</text><line x1="470" y1="57" x2="382" y2="57" stroke="#f59e0b" stroke-width="1" stroke-dasharray="3,3"/><text x="510" y="100" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="system-ui">RBAC</text><line x1="490" y1="97" x2="380" y2="85" stroke="#3b82f6" stroke-width="1" stroke-dasharray="3,3"/><text x="510" y="140" text-anchor="middle" fill="#a855f7" font-size="10" font-family="system-ui">Audit Logs</text><line x1="470" y1="137" x2="378" y2="120" stroke="#a855f7" stroke-width="1" stroke-dasharray="3,3"/></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Defense in depth: multiple security layers protect your infrastructure from threats.</p></div>

Doppler: The Cloud-Native Option

Doppler is a cloud-hosted secrets management platform. No self-hosting, no infrastructure to manage — just a clean API and CLI.

# Install Doppler CLI
curl -sLf https://cli.doppler.com/install.sh | sh

# Setup project
doppler setup

# Run with secrets injected
doppler run -- node server.js

# Fetch specific secret
doppler secrets get DATABASE_URL --plain
// Doppler SDK for dynamic secrets
import { DopplerSDK } from '@doppler/node-sdk';

const doppler = new DopplerSDK({ accessToken: process.env.DOPPLER_TOKEN });
const secrets = await doppler.secrets.list({ project: 'myapp', config: 'production' });

// Access secrets
const dbUrl = secrets.find(s => s.name === 'DATABASE_URL').value.computed;

Comparison

Feature
Vault
Infisical
Doppler

|---------|-------|-----------|---------|

Self-hosted
Yes (complex)
Yes (simple)
No (cloud only)
Open source
Yes (BSL license)
Yes (MIT)
No
Dynamic secrets
Yes (databases, cloud IAM, PKI)
No
No
Secret rotation
Automatic (lease-based)
Manual / webhooks
Manual / webhooks
Encryption-as-service
Yes (Transit engine)
No
No
PKI / certificates
Yes
No
No
K8s integration
Agent injector, CSI
Operator, CSI
Operator
Docker integration
Agent sidecar
CLI, SDK
CLI, SDK
UI quality
Basic
Excellent
Excellent
CLI experience
Good
Excellent
Excellent
Learning curve
Steep
Moderate
Easy
Setup time
Hours/days
30 minutes
10 minutes
HA deployment
Complex (Raft, Consul)
PostgreSQL + Redis
Managed
Access control
Policies (HCL)
RBAC (UI)
RBAC (UI)
Audit logging
Detailed
Yes
Yes
Cost (self-hosted)
Free (BSL)
Free (MIT)
N/A
Cost (cloud)
HCP Vault from $0.03/secret
Free tier + paid
$18/month/user
Secret versioning
Yes
Yes
Yes

When to Choose Each

Choose Vault when:

You need dynamic secrets (auto-rotating database credentials)
You need PKI / certificate management
You need encryption-as-a-service
You have a dedicated security or platform team
You run Kubernetes and want the mature Agent Injector

Choose Infisical when:

Developer experience is the priority
You want to self-host but keep it simple
Your team is small-to-medium
You need quick setup (under 30 minutes)
You want an open-source MIT-licensed solution

Choose Doppler when:

You do not want to manage any infrastructure
Your team is entirely cloud-native
You want the easiest onboarding experience
Budget allows per-user pricing

<div style="margin:2.5rem auto;max-width:600px;width:100%;text-align:center;"><svg viewBox="0 0 600 180" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;"><rect width="600" height="180" rx="12" fill="#1a1a2e"/><circle cx="60" cy="90" r="20" fill="none" stroke="#3b82f6" stroke-width="2"/><text x="60" y="94" text-anchor="middle" fill="#3b82f6" font-size="11" font-family="system-ui">User</text><rect x="120" y="65" width="95" height="50" rx="8" fill="#6366f1" opacity="0.85"/><text x="167" y="85" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Identity</text><text x="167" y="100" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Verify</text><rect x="250" y="65" width="95" height="50" rx="8" fill="#a855f7" opacity="0.85"/><text x="297" y="85" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Policy</text><text x="297" y="100" text-anchor="middle" fill="#ffffff" font-size="10" font-family="system-ui">Engine</text><rect x="380" y="65" width="95" height="50" rx="8" fill="#2dd4bf" opacity="0.85"/><text x="427" y="85" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Access</text><text x="427" y="100" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">Proxy</text><rect x="510" y="65" width="60" height="50" rx="8" fill="#f59e0b" opacity="0.85"/><text x="540" y="94" text-anchor="middle" fill="#1a1a2e" font-size="10" font-family="system-ui">App</text><defs><marker id="arrow5" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6" fill="#e2e8f0"/></marker></defs><line x1="82" y1="90" x2="118" y2="90" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow5)"/><line x1="217" y1="90" x2="248" y2="90" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow5)"/><line x1="347" y1="90" x2="378" y2="90" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow5)"/><line x1="477" y1="90" x2="508" y2="90" stroke="#e2e8f0" stroke-width="1.5" marker-end="url(#arrow5)"/><text x="167" y="140" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">MFA + Device</text><text x="297" y="140" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">Least Privilege</text><text x="427" y="140" text-anchor="middle" fill="#94a3b8" font-size="9" font-family="system-ui">Encrypted Tunnel</text><text x="300" y="165" text-anchor="middle" fill="#6366f1" font-size="11" font-family="system-ui" font-weight="bold">Never Trust, Always Verify</text></svg><p style="margin-top:0.75rem;font-size:0.85rem;color:#94a3b8;font-style:italic;line-height:1.4;">Zero Trust architecture: every request is verified through identity, policy, and access proxy layers.</p></div>

Secret Rotation Strategy

Regardless of tool, implement a rotation strategy:

Critical secrets (DB passwords, API keys): Rotate every 30 days
Service tokens: Rotate every 90 days
TLS certificates: Auto-renew at 30 days before expiry
Personal access tokens: Rotate every 90 days, revoke on offboarding

At TechSaaS, we use Infisical for our self-hosted secrets management. It runs as a single Docker container with PostgreSQL and Redis (which we already have), and the UI makes it easy for our team to manage secrets across environments. For clients with advanced needs like dynamic database credentials or PKI, we deploy Vault with a managed HA configuration.

#secrets-management#vault#infisical#doppler#security

Need help with security?

TechSaaS provides expert consulting and managed services for cloud infrastructure, DevOps, and AI/ML operations.