Upgrade your security posture from file to keychain to hardware step-by-step
AES-256 encrypted file
OS-native protection
FIPS 140-3 HSM
Many projects store credentials in .env files. Here's how to migrate to AVP:
pip install avp-cli
# Create an encrypted vault file
avp init --backend file --path ~/.avp/vault.enc
# You'll be prompted to create a password
Enter vault password: ********
Confirm password: ********
Vault created successfully!
# Import all variables from .env file
avp import .env --format dotenv --workspace my-agent
Imported 5 secrets:
- OPENAI_API_KEY
- DATABASE_URL
- REDIS_URL
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
Replace environment variable access with AVP:
# Before: Using .env
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# After: Using AVP
from avp import AVPClient, FileBackend
client = AVPClient(FileBackend("~/.avp/vault.enc", password))
session = client.authenticate("my-agent")
api_key = client.retrieve(session.session_id, "OPENAI_API_KEY").value.decode()
# Add to .gitignore
echo ".env" >> .gitignore
# Remove from git history (if previously committed)
git rm --cached .env
git commit -m "Remove .env from version control"
Upgrade from file backend to OS-native keychain for better security:
avp export --backend file --path ~/.avp/vault.enc \
--workspace my-agent --output /tmp/secrets.json
# Secrets are temporarily in plaintext - handle carefully!
avp import /tmp/secrets.json --backend keychain \
--service-name my-app-avp --workspace my-agent
Imported 5 secrets to keychain
# macOS
rm -P /tmp/secrets.json
# Linux
shred -u /tmp/secrets.json
# Windows
cipher /w:C:\temp
# Before: File backend
from avp import AVPClient, FileBackend
client = AVPClient(FileBackend("~/.avp/vault.enc", password))
# After: Keychain backend
from avp import AVPClient, KeychainBackend
client = AVPClient(KeychainBackend(service_name="my-app-avp"))
For maximum security, migrate to hardware-backed storage with NexusClaw:
# Verify device is connected
avp discover --backend hardware
Device: NexusClaw v1.0
Serial: NC-2024-001234
Firmware: 0.1.0
Secure Element: TROPIC01
Status: Ready
# Set up device PIN
avp hardware init
Enter new PIN (6-8 digits): ******
Confirm PIN: ******
Device initialized successfully!
# Important: Save your recovery seed phrase
Recovery phrase:
1. abandon 2. ability 3. able ...
Store this phrase securely - it cannot be recovered!
avp export --backend keychain --service-name my-app-avp \
--workspace my-agent --output /tmp/secrets.json
avp import /tmp/secrets.json --backend hardware \
--workspace my-agent
Enter device PIN: ******
Importing secrets to hardware...
- OPENAI_API_KEY [slot 1]
- DATABASE_URL [slot 2]
- AWS_ACCESS_KEY_ID [slot 3]
...
Imported 5 secrets to hardware
# Before: Keychain backend
from avp import AVPClient, KeychainBackend
client = AVPClient(KeychainBackend(service_name="my-app-avp"))
# After: Hardware backend
from avp import AVPClient, HardwareBackend
client = AVPClient(HardwareBackend()) # Auto-detects NexusClaw
For production systems, consider using multiple backends based on sensitivity:
from avp import AVPClient, FileBackend, KeychainBackend, HardwareBackend
# Tiered security approach
class TieredVault:
def __init__(self):
# Critical secrets (API keys, private keys) -> Hardware
self.hardware = AVPClient(HardwareBackend())
# Sensitive secrets (database URLs) -> Keychain
self.keychain = AVPClient(KeychainBackend("my-app"))
# Development/test secrets -> File
self.file = AVPClient(FileBackend("./dev-vault.enc", "dev-pass"))
def get_secret(self, name: str, tier: str = "keychain"):
if tier == "hardware":
client = self.hardware
elif tier == "keychain":
client = self.keychain
else:
client = self.file
session = client.authenticate("default")
return client.retrieve(session.session_id, name)
# Usage
vault = TieredVault()
api_key = vault.get_secret("OPENAI_API_KEY", tier="hardware")
db_url = vault.get_secret("DATABASE_URL", tier="keychain")