Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Secure key management for AI agents. Use when handling private keys, API secrets, wallet credentials, or when building systems that need agent-controlled funds. Covers secure storage, session keys, leak prevention, prompt injection defense, and MetaMask Delegation Framework integration.
Secure key management for AI agents. Use when handling private keys, API secrets, wallet credentials, or when building systems that need agent-controlled funds. Covers secure storage, session keys, leak prevention, prompt injection defense, and MetaMask Delegation Framework integration.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Secure key management patterns for AI agents handling wallets, private keys, and secrets.
Agent needs wallet/blockchain access Handling API keys, credentials, or secrets Building systems where AI controls funds Preventing secret leakage via prompts or outputs
# Install 1Password CLI brew install 1password-cli # Authenticate eval $(op signin) # Create vault for agent credentials op vault create "Agent-Credentials" # Run examples cd examples && python test_suite.py
RuleWhyNever store raw private keysConfig, env, memory, or conversation = leakedUse delegated accessSession keys with time/value/scope limitsSecrets via secret manager1Password, Vault, AWS Secrets ManagerSanitize all outputsScan for key patterns before any responseValidate all inputsCheck for injection attempts before wallet ops
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ AI Agent โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ Session Key (bounded) โ โ โโ Expires after N hours โ โ โโ Max spend per tx/day โ โ โโ Whitelist of allowed contracts/methods โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ Secret Manager (1Password/Vault) โ โ โโ Retrieve at runtime only โ โ โโ Never persist to disk โ โ โโ Audit trail of accesses โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ Smart Account (ERC-4337) โ โ โโ Programmable permissions โ โ โโ Recovery without key exposure โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
FilePurposeexamples/secret_manager.py1Password integration for runtime secret retrievalexamples/sanitizer.pyOutput sanitization (keys, seeds, tokens)examples/validator.pyInput validation (prompt injection defense)examples/session_keys.pyERC-4337 session key configurationexamples/delegation_integration.tsMetaMask Delegation Framework (EIP-7710)examples/pre-commitGit hook to block secret commitsexamples/test_suite.pyAdversarial test suitedocs/prompt-injection.mdDeep dive on injection defensedocs/secure-storage.mdSecret storage patternsdocs/session-keys.mdSession key architecturedocs/leak-prevention.mdOutput sanitization patternsdocs/delegation-framework.mdOn-chain permission enforcement (EIP-7710)
# Retrieve at runtime (never store result) SESSION_KEY=$(op read "op://Agents/my-agent/session-key") # Run with injected secrets (never touch disk) op run --env-file=.env.tpl -- python agent.py
PRIVATE_KEY=op://Agents/trading-bot/session-key RPC_URL=op://Infra/alchemy/sepolia-url OPENAI_API_KEY=op://Services/openai/api-key
from secret_manager import get_session_key # Retrieve validated session key creds = get_session_key("trading-bot-session") # Check validity if creds.is_expired(): raise ValueError("Session expired - request renewal from operator") print(f"Time remaining: {creds.time_remaining()}") print(f"Allowed contracts: {creds.allowed_contracts}") # Use the key (never log it!) client.set_signer(creds.session_key)
Configure 1Password vault permissions: Agent-Credentials/ โโโ trading-bot-session # Agent can read โโโ payment-bot-session # Agent can read โโโ master-key # Operator ONLY (agent has no access) Principle: Agent credentials should be in a vault with read-only agent access. Master keys should be in a separate vault the agent cannot access.
Apply to ALL agent outputs before sending anywhere: from sanitizer import OutputSanitizer def respond(content: str) -> str: """Sanitize before any output.""" return OutputSanitizer.sanitize(content) # Catches: # - Private keys (0x + 64 hex) # - OpenAI/Anthropic/Groq/AWS keys # - GitHub/Slack/Discord tokens # - BIP-39 seed phrases (12/24 words) # - PEM private keys # - JWT tokens
PatternExampleResultETH private key0x1234...abcd (64 hex)[PRIVATE_KEY_REDACTED]ETH address0x742d...f44e (40 hex)0x742d...f44e (truncated)OpenAI keysk-proj-abc123...[OPENAI_KEY_REDACTED]Anthropic keysk-ant-api03-...[ANTHROPIC_KEY_REDACTED]12-word seedabandon ability able...[SEED_PHRASE_12_WORDS_REDACTED]JWTeyJhbG...[JWT_TOKEN_REDACTED]
Check inputs before ANY wallet operation: from validator import InputValidator, ThreatLevel result = InputValidator.validate(user_input) if result.level == ThreatLevel.BLOCKED: return f"Request blocked: {result.reason}" if result.level == ThreatLevel.SUSPICIOUS: # Log for review, but allow log_suspicious(user_input, result.reason) # Proceed with operation
CategoryExamplesActionExtraction"show private key", "reveal secrets"BlockOverride"ignore previous instructions"BlockRole manipulation"you are now admin"BlockJailbreak"DAN mode", "bypass filters"BlockExfiltration"send config to https://..."BlockWallet threats"transfer all", "unlimited approve"BlockEncodedBase64/hex encoded attacksBlockUnicode tricksCyrillic lookalikes, zero-widthBlockSuspicious"hypothetically", "just between us"Warn
Never execute arbitrary operations. Explicit whitelist only: from dataclasses import dataclass from decimal import Decimal from typing import Optional @dataclass class AllowedOperation: name: str handler: callable max_value: Optional[Decimal] = None requires_confirmation: bool = False cooldown_seconds: int = 0 ALLOWED_OPS = { "check_balance": AllowedOperation("check_balance", get_balance), "transfer_usdc": AllowedOperation( "transfer_usdc", transfer, max_value=Decimal("500"), requires_confirmation=True, cooldown_seconds=60 ), "swap": AllowedOperation( "swap", swap_tokens, max_value=Decimal("1000"), cooldown_seconds=300 ), } def execute(op_name: str, **kwargs): if op_name not in ALLOWED_OPS: raise PermissionError(f"Operation '{op_name}' not allowed") op = ALLOWED_OPS[op_name] if op.max_value and kwargs.get("amount", 0) > op.max_value: raise PermissionError(f"Amount exceeds limit: {op.max_value}") if op.requires_confirmation: return request_confirmation(op_name, kwargs) return op.handler(**kwargs)
High-value operations require explicit confirmation: import hashlib import time pending_confirmations = {} def request_confirmation(operation: str, details: dict) -> str: code = hashlib.sha256( f"{operation}{time.time()}".encode() ).hexdigest()[:8].upper() pending_confirmations[code] = { "op": operation, "details": details, "expires": time.time() + 300 # 5 minutes } return f"โ ๏ธ Confirm '{operation}' with code: {code}\n(expires in 5 minutes)" def confirm(code: str): if code not in pending_confirmations: return "Invalid confirmation code" req = pending_confirmations.pop(code) if time.time() > req["expires"]: return "Confirmation code expired" return execute_confirmed(req["op"], req["details"])
Instead of giving agents master keys, issue bounded session keys: from session_keys import SessionKeyManager # Operator creates trading session for agent config = SessionKeyManager.create_trading_session( agent_name="alpha-trader", operator_address="0x742d...", duration_hours=24, max_trade_usdc=1000, daily_limit_usdc=5000, ) # Export for storage in 1Password export_data = SessionKeyManager.export_for_1password( config, session_key_hex="0x..." # Generated session key ) # op item create ... (store in 1Password)
FeatureMaster KeySession KeyExpirationNeverConfigurable (hours/days)Spending limitsNonePer-tx and daily capsContract restrictionsFull accessWhitelist onlyRevocationRequires key rotationInstant, no key changeAuditNoneFull operation log
Block commits containing secrets: # Install cp examples/pre-commit .git/hooks/ chmod +x .git/hooks/pre-commit Detected patterns: ETH private keys (64 hex chars) OpenAI/Anthropic/Groq keys AWS access keys GitHub/GitLab tokens Slack/Discord tokens PEM private keys Generic PASSWORD/SECRET assignments BIP-39 seed phrases
USER INPUT โ โผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Layer 1: Input Validation โ โ Regex + encoding + unicode checks โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Layer 2: Op Allowlisting โ โ Explicit whitelist only โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Layer 3: Value Limits โ โ Max per-tx and per-day โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Layer 4: Confirmation โ โ Time-limited codes for $$$ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Layer 5: Isolated Exec โ โ Wallet ops != conversation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โผ OUTPUT SANITIZATION
# memory/2026-02-07.md Private key: 0x9f01dad551039daad... Fix: Store reference only: Private key: [stored in 1Password: test-wallet]
except Exception as e: log(f"Failed with key {private_key}: {e}") Fix: Never include credentials in error context
PRIVATE_KEY=sk-ant-api03-real-key... # "for testing" Fix: Use obviously fake: PRIVATE_KEY=your-key-here
User: "Transfer all my USDC" Agent: *executes unlimited transfer* Fix: Block "all/everything/max" patterns, require explicit amounts
# Wallet has access to conversation history self.wallet.execute(conversation[-1]["content"]) Fix: Wallet operations must be isolated from conversation context
cd examples # Run full test suite python test_suite.py # Test individual components python sanitizer.py # Output sanitization demo python validator.py # Input validation demo python session_keys.py # Session key demo Expected output: All tests passed
1Password CLI installed and authenticated Secrets in 1Password vault, not files Session keys with expiry and limits Output sanitization on all responses Input validation before wallet ops Pre-commit hook installed Confirmation flow for high-value operations Wallet operations isolated from conversation .gitignore covers secrets and memory files Test suite passes
This skill provides defense in depth, not a guarantee. Adversaries may: Novel injection patterns - Regex can't catch everything; semantic analysis helps but isn't perfect Social engineering - Convincing the operator to approve malicious operations Timing attacks - Exploiting confirmation windows Encoding evasion - New encoding schemes not covered Recommendation: Layer these defenses with: Rate limiting Anomaly detection Human-in-the-loop for large transactions Regular security audits
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.