This document describes ID Wispera's security architecture and threat model.
ID Wispera is designed with security-first principles:
- Local-first: Credentials never leave your machine unless explicitly shared
- Zero-knowledge: Sharing uses client-side encryption
- Audit everything: Complete visibility into credential usage
- Policy enforcement: Declarative rules prevent unauthorized access
- Algorithm: AES-256-GCM
- Key Derivation: PBKDF2 with SHA-256 (100,000 iterations)
- Salt: 32 bytes, randomly generated per vault
- IV: 12 bytes, randomly generated per encryption operation
Master Passphrase → PBKDF2(passphrase, salt, 100000, SHA-256) → 256-bit key
The vault file contains:
- Version number (unencrypted)
- Salt (unencrypted, needed for key derivation)
- IV (unencrypted, needed for decryption)
- Encrypted passport data
- Encrypted audit log
- Metadata (unencrypted: creation time, passport count)
Share links use:
- Fresh AES-256-GCM key per share
- Key sent separately from encrypted payload
- Optional time and view limits
ID Wispera supports multiple authentication modes to unlock the vault. All modes derive the same AES-256-GCM decryption key; they differ only in how the passphrase is supplied.
In Passphrase Mode, the master passphrase is resolved through the PassphraseProvider chain, which is evaluated in order:
IDW_SESSION_TOKENenvironment variable -- If set, the token is used to look up and decrypt the passphrase from the sidecar file (~/.id-wispera/sessions.json). This is the recommended path for CI/headless environments.- OS keychain -- On macOS (Keychain), Linux (libsecret/kwallet), and Windows (Credential Manager), the passphrase is retrieved from the system keychain. This is the recommended path for interactive developer use.
IDW_PASSPHRASEenvironment variable or.envfile -- If theIDW_PASSPHRASEenvironment variable is set, its value is used directly. Otherwise the provider checks$CWD/.envand~/.id-wispera/.envfor the key. OnlyIDW_PASSPHRASEis read from the file; no other variables are loaded. A warning is emitted if the.envfile is world-readable. This mode is useful for local development in environments without an OS keychain (containers, WSL, minimal Linux). For best security, restrict file permissions:chmod 600 .env.- Interactive prompt -- If none of the above succeed, the CLI prompts the user for their passphrase via a secure TTY prompt (stdin is not echoed).
Store your passphrase in the OS keychain with:
idw auth loginCheck current authentication status:
idw auth statusRemove the keychain entry:
idw auth logoutSession tokens allow non-interactive vault access without exposing the master passphrase. Tokens are stored in the sidecar file at ~/.id-wispera/sessions.json, encrypted with PBKDF2 + AES-256-GCM (separate from the vault encryption).
Create a session token:
idw auth token create --name "github-actions" --expires 90dThe command prints a token string (idwst_...). Store it as a CI secret and set IDW_SESSION_TOKEN in the runner environment.
List active tokens:
idw auth token listRevoke a token:
idw auth token revoke --name "github-actions"The sidecar file (sessions.json) contains an encrypted mapping from token IDs to vault passphrases. Each entry is independently encrypted with PBKDF2 + AES-256-GCM using the token value as input key material. Compromising one token does not reveal other sessions. The sidecar file is permission-locked to 600 and excluded from vault backups.
-
Credential Theft
- Encrypted at rest
- Memory cleared after lock
- No plaintext in logs
-
Unauthorized Access
- Passphrase required
- Policy enforcement
- Audit trail
-
Credential Misuse
- Scope limitations
- Expiration enforcement
- Revocation capability
-
Audit Trail Tampering
- Append-only log
- Encrypted with vault
-
Accidental Exposure
- Credential detection
- Masked display
- .gitignore templates
-
Compromised Master Passphrase
- Use a strong, unique passphrase
- Consider a password manager
-
Compromised Machine
- If your machine is compromised, credentials may be extracted
- Use full-disk encryption
-
Memory Attacks
- Credentials exist in memory while in use
- Consider hardware security modules for high-security needs
-
Social Engineering
- Train users on security awareness
-
Session Token Environment Variable Exposure
- When
IDW_SESSION_TOKENis set in a CI runner, any process on the same machine can read it from/proc/<pid>/environor equivalent - Limit token scope and expiry to reduce blast radius
- Prefer short-lived tokens and revoke them after use
- When
-
IDW_PASSPHRASEEnvironment Variable Exposure- When
IDW_PASSPHRASEis set in the process environment, any process that can inspect the environment can read it - Prefer a
.envfile with restricted permissions (chmod 600) over exporting the variable in your shell profile - For higher security, use the OS keychain (interactive) or session tokens (CI)
- When
- Minimum 12 characters recommended
- Mix of character types
- Unique to ID Wispera
- Store in a password manager or the OS keychain (
idw auth login) - Never commit to version control
- When using
IDW_PASSPHRASE, prefer a.envfile withchmod 600over exporting in your shell profile
- Create short-lived, named tokens:
idw auth token create --name "ci-deploy" --expires 7d - Revoke tokens immediately when a CI pipeline is decommissioned
- Store tokens in your CI platform's secrets manager (e.g., GitHub Actions secrets, GitLab CI variables)
- Rotate tokens on a regular schedule
- Audit active tokens with
idw auth token list
- Store on encrypted filesystem
- Regular backups (encrypted)
- Limit file permissions:
chmod 600 vault.json - Don't share the vault file directly
- Set expiration dates
- Rotate credentials regularly
- Revoke unused credentials
- Use minimum required scope
- Tag for organization
- Review audit logs regularly
- Monitor for suspicious activity
- Keep ID Wispera updated
- Use MCP server for agent access (not direct vault access)
ID Wispera can detect exposed credentials:
idw scan ./projectDetects:
- API keys (OpenAI, AWS, GitHub, etc.)
- JWTs
- Private keys
- Connection strings
- Generic secrets
Rules automatically enforced:
- Human owner required
- Maximum validity period
- Delegation depth limits
- Visa type restrictions
Every action is logged:
- Creation, access, modification
- Who performed the action
- When it occurred
- From which platform
- With what purpose
Zero-knowledge sharing:
- Client-side encryption
- Key never sent with payload
- Time and view limits
- Scope restrictions (full, read-only, metadata-only)
The audit log supports compliance requirements:
- Complete access history
- Actor identification
- Timestamp with timezone
- Platform and purpose tracking
- Export to CSV/JSON
ID Wispera is local-first:
- Credentials stored locally
- No cloud sync required
- Optional self-hosted sync
- Audit logs stay local
Policy engine supports:
- Role-based restrictions via tags
- Time-based access
- Approval workflows
- Delegation limits
-
Immediately revoke the credential:
idw revoke <passport-id> --reason "Exposed in [location]"
-
Review audit log:
idw audit <passport-id>
-
Rotate the credential at the source
-
Create new passport with fresh credential
- Generate new credentials at all sources
- Create a new vault
- Import fresh credentials
- Delete old vault securely
- Review audit log for anomalies
- Check for unauthorized access patterns
- Verify delegation chains
- Revoke suspicious passports
- Notify affected parties
If you discover a security vulnerability:
- Do not open a public issue
- Email: security@id-wispera.ai
- Include:
- Description of the vulnerability
- Steps to reproduce
- Potential impact
- Allow time for a fix before disclosure