Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/rohansx/wardn
Authentification et AutorisationOutils de Chiffrement/DéchiffrementSécurité CloudDevSecOpsUtilitaires et FrameworksDétection de SecretsGestion des Identités et des Accès (IAM)Sécurité de la Chaîne LogistiqueSécurité des API
GitHubrohansx/wardn

wardn

isolement des identifiants pour les agents IA. Les agents ne voient jamais les vraies clés API - garantie structurelle, pas une politique.

3635il y a 2 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Voir le dépôt
Partager

wardn

Un pare-feu d'identifiants pour les agents IA.

L'affirmation principale est structurelle, pas politique : les agents reçoivent des jetons fictifs, jamais de véritables clés API. La vraie clé ne traverse qu'une seule interface réseau — à l'intérieur du proxy wardn, en route vers l'API amont — et est retirée des réponses avant qu'elles n'atteignent l'agent. Les journaux, l'environnement, les fenêtres de contexte du LLM, les fichiers temporaires et l'historique du shell ne contiennent que des substituts.```text agent process OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) agent logs Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn proxy injects the real key in-flight, single seam (deleted on response) ~/.vibeguard/vault.enc AES-256-GCM(Argon2id(passphrase)) (encrypted at rest)

root@kitploit:~
C'est l'affirmation principale et elle est défendable aujourd'hui contre la compromission d'agent, l'injection de prompts, le vol de logs et l'exfiltration de compétences.
Lisez [docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md) pour la répartition honnête entre ce qui est couvert et ce qui ne l'est pas — y compris le niveau où l'affirmation plus forte « la compromission de l'hôte ne fuit rien » devient atteignable.

Le coffre lui-même (chiffré au repos, clé dérivée d'une phrase de passe) est un composant réel et la raison pour laquelle le pare-feu peut fonctionner sur une seule machine. Le niveau à venir [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md) enveloppe en outre le proxy dans une enclave de calcul confidentiel de sorte que même un VPS entièrement compromis ne puisse pas lire la clé.

[![Crates.io](https://img.shields.io/crates/v/wardn.svg)](https://crates.io/crates/wardn)
[![License](https://img.shields.io/crates/l/wardn.svg)](LICENSE)

## Le Problème

Chaque framework d'agent IA aujourd'hui stocke les clés API dans des variables d'environnement ou des fichiers `.env`. Un agent compromis, une compétence malveillante, un voleur générique ou une injection de prompt exfiltrent `Authorization: Bearer sk-...` d'un journal LLM et obtiennent un accès complet à vos informations d'identification.```
~/.env              → OPENAI_KEY=sk-proj-real-key      # plaintext, readable by anyone
agent context       → "Use OPENAI_KEY=sk-proj-real-key" # leaked into LLM context window
agent logs          → Authorization: Bearer sk-proj-... # sitting in log files

The Fix: A Credential Firewall

wardn remet aux agents une chaîne de substitution inutile et supprime la clé réelle de toutes les surfaces qu'il peut atteindre. Les vraies clés sont injectées au niveau du réseau — une seule couture — et retirées des réponses avant qu'elles n'atteignent l'agent.``` agent environment → OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn vault → OPENAI_KEY=sk-proj-real-key (encrypted at rest) upstream request → Authorization: Bearer sk-proj-real-key (network transit only) upstream response → ...real keys stripped, placeholders returned... (re-injected on the way back) agent logs → Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context window → wdn_placeholder_a1b2c3d4e5f6g7h8 (useless)

root@kitploit:~
## Architecture```mermaid
flowchart TB
    subgraph Agent["AI Agent Process"]
        A1["Agent Code"]
        A2["ENV: OPENAI_KEY=wdn_placeholder_a1b2..."]
    end

    subgraph Wardn["wardn daemon · localhost:7777"]
        direction TB
        P["HTTP Proxy"]
        MCP["MCP Server\n(stdio)"]

        subgraph Pipeline["Request Pipeline"]
            direction LR
            S1["Identify\nAgent"] --> S2["Resolve\nPlaceholder"] --> S3["Check\nAuth"] --> S4["Rate\nLimit"] --> S5["Inject\nReal Key"]
        end

        subgraph ResponsePipeline["Response Pipeline"]
            direction RL
            R1["Strip Real\nKeys"] --> R2["Replace with\nPlaceholders"]
        end

        subgraph Vault["Encrypted Vault"]
            V1["AES-256-GCM"]
            V2["Argon2id KDF"]
            V3["Placeholder Map\nper agent × credential"]
        end
    end

    subgraph External["External APIs"]
        E1["api.openai.com"]
        E2["api.anthropic.com"]
        E3["..."]
    end

    A1 -- "placeholder token\nin headers/body" --> P
    A1 -. "MCP: get_credential_ref\nlist_credentials\ncheck_rate_limit" .-> MCP
    MCP -. "placeholder token\n(never real keys)" .-> A1
    P --> Pipeline
    Pipeline --> External
    External --> ResponsePipeline
    ResponsePipeline -- "response with\nplaceholders only" --> A1
    Pipeline <--> Vault
    ResponsePipeline <--> Vault

    style Agent fill:#1a1a2e,stroke:#e94560,color:#fff
    style Wardn fill:#0f3460,stroke:#16213e,color:#fff
    style Pipeline fill:#16213e,stroke:#e94560,color:#fff
    style ResponsePipeline fill:#16213e,stroke:#e94560,color:#fff
    style Vault fill:#1a1a2e,stroke:#00d2ff,color:#fff
    style External fill:#0a0a0a,stroke:#533483,color:#fff

Fonctionnement```

Agent sends request with placeholder in Authorization header │ ▼ ┌─────────────────────────┐ │ wardn proxy │ │ localhost:7777 │ │ │ │ 1. Identify agent │ │ 2. Resolve placeholder │ │ 3. Check authorization │ │ 4. Check rate limit │ │ 5. Inject real key │ │ 6. Forward request │ │ 7. Strip key from resp │ │ 8. Return to agent │ └─────────────────────────┘ │ ▼ External API (only place real key exists in transit)

root@kitploit:~
## Démonstration

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/12823/1fa6109ffd855ec98c173c5edd2d7ee77f6b0c918a3cdecb1ea5fbfe8326161d.gif" alt="démonstration de wardn" width="800">
</p>

## Niveaux de confiance, en toute honnêteté

| Niveau | Où | Ce qui est garanti |
|---|---|---|
| **Auto-hébergé (aujourd'hui)** | votre ordinateur portable, votre VPS, CI | Coffre crypté au repos, protection par pare-feu contre les agents. **Ne défend pas** contre un root sur l'hôte. |
| **Hébergé (à venir)** | géré par wardn ou BYO-cloud | Enclave de calcul confidentiel (Nitro / SEV-SNP) + attestation à distance + flux de chiffrement vers le proxy. Véritable revendication « la compromission de l'hôte ne fuit rien ». |

Le niveau auto-hébergé est la revendication principale et est livré aujourd'hui. Le niveau hébergé
est la voie de mise à niveau stricte : il coûte de l'argent et de la complexité opérationnelle, et
sa conception se trouve dans [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md). Inventaire complet et honnête
de ce qui est et n'est pas couvert :

👉 **[docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md)** — tableau des sujets couverts / non couverts,
« aucun coffre logiciel n'élimine la compromission de l'hôte » clairement mentionné, et
la voie de mise à niveau.

## Installer```bash
# Prebuilt binary (Linux/macOS, amd64/arm64), checksum-verified
curl -sSf https://raw.githubusercontent.com/rohansx/wardn/main/install.sh | sh

# or from crates.io
cargo install wardn

# or Homebrew, once the tap is published (see Formula/wardn.rb)
brew install rohansx/wardn/wardn

Démarrage rapide```bash

Create an encrypted vault and store your keys

wardn vault create wardn vault set OPENAI_KEY wardn vault set ANTHROPIC_KEY

Set up Claude Code integration (one command)

wardn setup claude-code

root@kitploit:~
Voilà. Claude Code utilise désormais le serveur MCP de wardn pour obtenir des jetons placeholders au lieu de lire les vraies clés de votre environnement.

### Ce qui se passe ensuite

1. Claude Code appelle `get_credential_ref` → reçoit `wdn_placeholder_a1b2...` (pas la vraie clé)
2. L'agent envoie la requête avec le placeholder via le proxy wardn
3. Le proxy échange le placeholder contre la vraie clé, la transmet à l'API
4. Le proxy retire la vraie clé de la réponse avant de la renvoyer à l'agent

La vraie clé n'entre jamais dans la mémoire, les journaux ou la fenêtre de contexte LLM de l'agent.

## Tableau de bord local

Une fois le daemon lancé (`wardn serve`, ou généré par `wardn run`), ouvrez
**http://127.0.0.1:7777/ui** dans un navigateur. Une vue en lecture seule, locale uniquement, de :

- **Credentials** — chaque identifiant stocké avec ses ACL (agents autorisés, domaines autorisés, badges de limite de débit et de budget).
- **Recent Activity** — les 50 derniers événements proxy avec méthode, domaine, chemin, statut, agent, request_id et coût enregistré (`request_completed`, `credential_injected`, `rate_limit`, `budget_exceeded`, `loop_detected`, `request_error`).
- **Budgets** — le budget configuré de chaque identifiant (max, dépensé, restant, fenêtre, mode) avec une barre de progression qui passe de avertissement → mauvais lorsqu'elle franchit 50% / 80%.

Interrogé automatiquement toutes les 2 s. Aucun point de terminaison de mutation — la seule façon de sortir du tableau de bord est l'API elle-même (`/api/summary`, `/api/credentials`, `/api/audit?limit=N`, `/api/budgets`).```bash
# Static, anonymous, never sees real keys
curl http://127.0.0.1:7777/api/summary | jq

Installation manuelle```bash

Get a placeholder token (never the real key)

wardn vault get OPENAI_KEY

→ wdn_placeholder_a1b2c3d4e5f6g7h8

List stored credentials (names only, no values)

wardn vault list

Start the proxy

wardn serve

Start proxy + MCP server for Claude Code / Cursor

wardn serve --mcp --agent my-agent

root@kitploit:~
## Référence CLI

### Gestion des coffres```bash
wardn vault create                        # create encrypted vault
wardn vault set OPENAI_KEY                # store credential (prompts for value, no echo)
wardn vault get OPENAI_KEY                # get placeholder token (never the real value)
wardn vault get OPENAI_KEY --agent bot    # get placeholder for specific agent
wardn vault list                          # list all credentials
wardn vault rotate OPENAI_KEY             # rotate value, placeholders unchanged
wardn vault remove OPENAI_KEY             # remove credential

# Custom vault path
wardn --vault /path/to/vault.enc vault list

Serveur Proxy```bash

wardn serve # HTTP proxy on 127.0.0.1:7777 wardn serve --host 0.0.0.0 --port 8080 # custom bind address wardn serve --config wardn.toml # load config with rate limits + ACLs wardn serve --mcp --agent my-agent # proxy + MCP server (stdio)

root@kitploit:~
### Intégration de Claude Code / Cursor```bash
wardn setup claude-code                   # register wardn as MCP server in Claude Code
wardn setup cursor                        # register wardn as MCP server in Cursor

# Or manually:
claude mcp add --transport stdio --scope user wardn -- wardn serve --mcp --agent claude-code

Ce que fait wardn setup

  1. Demande votre phrase de passe du coffre et vérifie qu'elle permet d'ouvrir le coffre
  2. Trouve le chemin du binaire wardn sur votre système
  3. Enregistre wardn en tant que serveur MCP :
    • Claude Code : exécute claude mcp add avec WARDN_PASSPHRASE dans la configuration d'environnement
    • Cursor : écrit dans ~/.cursor/mcp.json avec la phrase de passe dans env
  4. Au prochain lancement, l'IDE lance wardn serve --mcp en tant que sous-processus

Vérifier son fonctionnement

Après avoir exécuté la configuration, redémarrez votre IDE et essayez ces invites :``` "List my wardn credentials" → Claude calls list_credentials, shows credential names (never values)

"Get me a reference to OPENAI_KEY" → Claude calls get_credential_ref, gets wdn_placeholder_... (not the real key)

"Check my rate limit for OPENAI_KEY" → Claude calls check_rate_limit, shows remaining quota

root@kitploit:~
#### Outils MCP disponibles

| Tool | Ce qu'il renvoie | Sécurité |
|------|-----------------|----------|
| `get_credential_ref` | Jeton de substitution (`wdn_placeholder_...`) | Jamais la valeur réelle |
| `list_credentials` | Noms des identifiants + métadonnées | Filtré par l'accès de l'agent |
| `check_rate_limit` | Quota restant, infos de nouvelle tentative | Lecture seule |

### Migration des identifiants```bash
wardn migrate --dry-run                             # audit Claude Code dir for exposed keys
wardn migrate --source claude-code                  # scan + migrate to vault
wardn migrate --source open-claw                    # scan OpenClaw config
wardn migrate --source directory --path ./my-proj   # scan any directory

Importation des identifiants```bash

Classic .env file (KEY=value, comments, optional export, quoted values

with backslash escapes honored)

wardn import dotenv ./.env

JSON or YAML file. Format inferred from extension; either a flat map

or a structured {credentials: [{name, value}, ...]} shape.

wardn import file ./creds.json wardn import file ./creds.yaml

1Password CLI — reuses your signed-in op session. Default name is

derived from the ref's last segment; override with --name.

wardn import one-password op://Personal/openai/api_key wardn import one-password op://Work/anthropic/token --name ANTHROPIC_KEY

stdin — read .env-format lines. Useful for piping.

echo 'OPENAI_KEY=sk-...' | wardn import stdin

root@kitploit:~
Chaque importateur demande la phrase de passe du coffre lors de la première utilisation (ou la lit
depuis `WARDN_PASSPHRASE` / le trousseau de l'OS). Les valeurs existantes sont silencieusement
écrasées — l'importateur est uniquement basé sur les valeurs, les métadonnées (agents autorisés /
domaines / limite de débit / budget) sont préservées.

### Automatisation

Pour CI/scripts, définissez les variables d'environnement `WARDN_PASSPHRASE` et `WARDN_VALUE` pour ignorer les invites interactives :```bash
WARDN_PASSPHRASE=my-pass wardn vault list
WARDN_PASSPHRASE=my-pass WARDN_VALUE=sk-proj-xxx wardn vault set OPENAI_KEY

API de la bibliothèque

Ajoutez à votre Cargo.toml :```toml [dependencies] wardn = "0.4"

root@kitploit:~
### Opérations Vault```rust
use wardn::{Vault, config::CredentialConfig};

// Create an encrypted vault
let vault = Vault::create("vault.enc", "my-passphrase")?;

// Store a credential
vault.set_with_config("OPENAI_KEY", "sk-proj-real-key-123", &CredentialConfig {
    allowed_agents: vec!["researcher".into(), "writer".into()],
    allowed_domains: vec!["api.openai.com".into()],
    rate_limit: Some(RateLimitConfig { max_calls: 200, per: TimePeriod::Hour }),
})?;

// Agent gets a placeholder (not the real key)
let placeholder = vault.get_placeholder("OPENAI_KEY", "researcher")?;
// → "wdn_placeholder_a1b2c3d4e5f6g7h8"

// Rotate the real key — all placeholders keep working
vault.rotate("OPENAI_KEY", "sk-proj-new-key-456")?;

Proxy HTTP```rust

use wardn::daemon::{Daemon, DaemonConfig};

let daemon = Daemon::new(vault, DaemonConfig::default()); daemon.serve_proxy().await?;

root@kitploit:~
### MCP Server```rust
use wardn::mcp::WardenMcpServer;

// Serve over stdio (for Claude Code, Cursor, etc.)
WardenMcpServer::serve_stdio(vault, rate_limiter, "agent-id".into()).await?;

MCP tools exposed (read-only, no credential values ever returned):

ToolDescription
get_credential_refGet your placeholder token for a credential
list_credentialsList credentials you're authorized to access
check_rate_limitCheck your remaining quota

Security Properties

What This Defeats

How Is This Different From...

For a deeper comparison against wardn's closest direct peers (Infisical Agent Vault, 1Password for Agents, LiteLLM virtual keys) and how wardn's guarantees map to OWASP's Agentic Top 10 and the MCP spec's security guidance, see docs/comparison.md.

Trust Boundary

Wardn concentrates trust in a single local process (the proxy) instead of spreading it across every plugin, tool, and LLM context window. This is a smaller attack surface, not zero attack surface:

  • The proxy runs locally as a subprocess spawned by your IDE or shell — same trust level as your kernel
  • The vault is encrypted at rest and only decrypted in-memory with your passphrase
  • If your local machine is fully compromised, wardn can't help (nothing can)
  • The placeholder token is a bearer token to the proxy — but it only works via localhost:7777, not against real APIs, and can be rate-limited and revoked per-agent

Audit Logging

Every credential access is logged with a unique request ID for traceability:``` INFO request_id=a1b2c3 agent=claude-code method=POST domain=api.openai.com path=/v1/chat/completions proxy request received INFO request_id=a1b2c3 agent=claude-code credential=OPENAI_KEY domain=api.openai.com credential injected INFO request_id=a1b2c3 agent=claude-code upstream_status=200 credentials_injected=1 credentials_stripped=0 proxy request completed

root@kitploit:~
Définissez `RUST_LOG=wardn=info` (ou `debug`/`trace`) pour contrôler la verbosité. Les logs vont sur stderr, jamais sur stdout.

## Configuration```toml
[warden]
vault_path = "~/.vibeguard/vault.enc"

[warden.credentials.OPENAI_KEY]
rate_limit = { max_calls = 200, per = "hour" }
allowed_agents = ["researcher", "writer"]
allowed_domains = ["api.openai.com"]

[warden.credentials.ANTHROPIC_KEY]
rate_limit = { max_calls = 100, per = "hour" }
allowed_agents = ["researcher"]
allowed_domains = ["api.anthropic.com"]

Structure du projet```

wardn/ ├── src/ │ ├── main.rs # CLI entry point (clap + tokio) │ ├── cli/ │ │ ├── mod.rs # Clap argument definitions │ │ ├── vault_cmd.rs # Vault subcommand handlers │ │ ├── serve_cmd.rs # Serve subcommand handler │ │ ├── run_cmd.rs # wardn run — lazy-starts the daemon, wires │ │ │ # agent env vars, execs the child │ │ ├── setup_cmd.rs # Claude Code / Cursor MCP setup (+ shell alias) │ │ └── migrate_cmd.rs # Migrate subcommand handler │ ├── lib.rs # Public API, WardenError │ ├── config.rs # TOML configuration parsing, [upstreams] map │ ├── vault/ │ │ ├── mod.rs # Vault CRUD operations │ │ ├── encryption.rs # AES-256-GCM + Argon2id + zeroize types │ │ ├── storage.rs # On-disk format (WDNV), atomic writes │ │ ├── placeholder.rs # Token generation, per-agent isolation │ │ └── keyring_store.rs # OS keychain passphrase storage │ ├── proxy/ │ │ ├── mod.rs # HTTP proxy server (axum) │ │ ├── route.rs # Provider-prefix vs Host-header upstream routing │ │ ├── inject.rs # Credential injection into requests │ │ ├── strip.rs # Credential stripping (shared pair-building) │ │ ├── stream.rs # Streaming (SSE/chunked) credential stripper │ │ └── rate_limit.rs # Token bucket rate limiter │ ├── mcp/ │ │ ├── mod.rs # MCP server (rmcp, stdio transport) │ │ └── tools.rs # Tool parameter/response types │ ├── migrate/ │ │ ├── mod.rs # Migration orchestrator + risk scoring │ │ └── scanners/ │ │ └── credentials.rs # API key pattern scanner │ └── daemon/ │ └── mod.rs # Daemon (proxy + MCP in single process) └── tests/ ├── cli_tests.rs # CLI integration tests ├── vault_tests.rs # Vault integration tests ├── proxy_tests.rs # Proxy tests without a real upstream ├── proxy_e2e_tests.rs # Real upstream via wiremock (header/body/SSE) └── run_cmd_tests.rs # Real end-to-end wardn run

root@kitploit:~
## Développement```bash
# Integration tests use a fast (insecure) KDF so the suite runs in
# milliseconds instead of paying the real Argon2id cost per test —
# always pass this feature flag when running tests locally or in CI:
cargo test --features test-fast-kdf

cargo build
cargo clippy --all-targets --features test-fast-kdf

Chiffrement du coffre```mermaid

flowchart LR subgraph Input Pass["Passphrase"] Salt["Random Salt\n(16 bytes)"] Creds["Credentials\n(JSON)"] end

root@kitploit:~
subgraph KDF["Key Derivation"]
    Argon["Argon2id\nm=19456 t=2 p=1"]
end

subgraph Encrypt["Encryption"]
    AES["AES-256-GCM"]
    Nonce["Random Nonce\n(12 bytes)"]
end

subgraph Output["WDNV File"]
    direction TB
    Magic["WDNV (4B)"]
    Ver["Version (2B)"]
    SaltOut["Salt (16B)"]
    Payload["Nonce ‖ Ciphertext ‖ Tag"]
end

Pass --> Argon
Salt --> Argon
Argon -- "256-bit key" --> AES
Creds --> AES
Nonce --> AES
AES --> Payload

style Input fill:#1a1a2e,stroke:#e94560,color:#fff
style KDF fill:#16213e,stroke:#00d2ff,color:#fff
style Encrypt fill:#16213e,stroke:#00d2ff,color:#fff
style Output fill:#0f3460,stroke:#533483,color:#fff
root@kitploit:~
### Format de fichier```
Bytes 0-3:   Magic "WDNV"
Bytes 4-5:   Version (u16 LE)
Bytes 6-21:  Argon2id salt (16 bytes)
Bytes 22+:   AES-256-GCM encrypted payload (nonce ‖ ciphertext ‖ tag)

Partie de VibeGuard

Wardn est la couche d'isolation des identifiants de VibeGuard — un démon de sécurité pour les agents IA. Autres modules prévus :

  • Sentinel — pare-feu d'injection d'invites
  • CloakPipe — middleware de rédaction des PII
  • Watcher — journal d'audit + tableau de bord

Licence

MIT

Télécharger l’outil
PropertyGuarantee
No credential in agent memoryAgent process only holds placeholder strings
No credential on disk in plaintextAES-256-GCM encrypted vault with Argon2id KDF
No credential in logsOnly placeholders appear in any log output
No credential in LLM contextPlaceholder injected into env, real key at network layer
Bounded cost exposureToken bucket rate limits per credential per agent
Credential echo protectionReal keys stripped from API responses before reaching agent
Memory safetySensitiveString/SensitiveBytes zeroed on drop
Atomic persistenceWrite-tmp-then-rename prevents vault corruption
AttackHow wardn stops it
.env credential theftNo .env files. Keys only in encrypted vault
Malicious skill reads $OPENAI_KEYGets wdn_placeholder_... — useless
Stealer targets agent configFinds only placeholder tokens
Prompt injection exfiltrates keyKey never in agent context window
Agent logs contain credentialsLogs contain only placeholder strings
Full agent compromiseAttacker has a useless placeholder
Cost runaway from looping agentRate limit per credential per agent
ToolWhat it doesHow wardn differs
Secrets managers (Vault, AWS SM, 1Password)Secure storage + retrievalAgent still gets the real key at runtime. Wardn ensures the agent never touches it.
VarlockSchema-based .env validation + AI-safe configFocuses on config management and leak scanning. Wardn does runtime credential injection — the key never enters the agent process.
OpenRouterAPI routing + key managementTrusts the client with an API key. Wardn doesn't — agent holds a useless placeholder.
dotenv + .gitignoreKeep secrets out of gitKeys still in memory, env vars, logs. Wardn removes them from all three.
Service meshes (Istio, Linkerd)Service-to-service authSolve infra-level mTLS. Wardn solves agent-to-API auth where the agent itself is untrusted.