📦 authlock — 机密保护
v1.0.2基于 TOTP/MFA 的本地机密存储服务,每次解密都需要进行多因素验证。支持 AES-256-GCM 加密、PIN 二次保护,可将密码、证书、密钥等敏感数据绑定到用户账号,存储在本地 ~/.authlock 或工作区路径。
详细分析 ▾
运行时依赖
版本
修复数据目录名称:.clawauth -> .authlock;改进 SKILL.md 语言一致性
安装命令
点击复制技能文档
提供基于 TOTP 的敏感数据(密码、证书、密钥)加密,每次解密都需要 MFA 验证。
Installation (安装)
# Install dependencies (安装依赖)
pip3 install --user cryptography pyotp qrcode
Usage:
# Direct call (recommended) python3 /authlock_cli.py
# Or add temporary alias (current shell only) alias authlock='python3 /authlock_cli.py'
is the skill installation directory, the parent folder of this SKILL.md file.Multi-tenant Support (多租户支持)
通过不同位置实现租户隔离,内部结构保持不变。
Location Levels (位置级别)
| Level | Location | Description |
|---|---|---|
| System (系统级) | ~/.authlock/ | Shared across all workspaces, default |
| Workspace (工作区级) | /.authlock/ | Independent for current workspace |
| User (用户级) | Custom path | User-specified location |
Lookup Priority
User (--path/AUTHLOCK_HOME) → Workspace → System
- User level highest: Via
--pathparameter orAUTHLOCK_HOMEenv var - Workspace level medium: Auto-detect
OPENCLAW_WORKSPACEenv or current directory - System level fallback: Default
~/.authlock/
Initialize Level
# Interactive selection (recommended) authlock init
# Specify level authlock init --level system # System level authlock init --level workspace # Workspace level authlock init --level user --path /custom/path # User level
View Location
# Show current location and lookup paths authlock which
# List all existing locations authlock locations
Location-specific Operations
# All commands support --path parameter
authlock seal secret.txt --name my-pass --path /custom/path
authlock open my-pass --code 123456 --path /custom/path
authlock list --path /custom/path
Quick Start (快速开始)
Initialize (初始化)
# Interactive level selection authlock init# Or specify level authlock init --level system authlock init --level workspace authlock init --level user --path /custom/path
# Or import existing seed authlock init --seed JBSWY3DPEHPK3PXP
Initialization displays QR code, scan with Microsoft Authenticator.
Seal (Encrypt) / 封印(加密)
# Encrypt file authlock seal ~/.ssh/id_rsa --name my-server-key# Encrypt text (from pipe) echo "super_secret_password" | authlock seal - --name db-password
# Encrypt with specified name authlock seal ~/.ssh/server.pem --name prod-ssh-key
Open (Decrypt) / 解密
# Decrypt to stdout authlock open my-server-key --code 123456# Decrypt to file authlock open my-server-key --code 123456 --output ~/.ssh/id_rsa
# Decrypt and execute (SSH example) authlock open prod-ssh-key --code 123456 --exec "ssh -i - user@host"
Management
# List all sealed secrets authlock list# Delete secret authlock delete old-password
# Show current location authlock which
# List all locations authlock locations
How It Works
┌─────────────────────────────────────────────────────────┐ │ Encryption Flow │ │ │ │ Sensitive data ──┐ │ │ ├──► AES-256-GCM ──► Ciphertext │ │ TOTP seed ───────┘ │ │ + salt │ └─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐ │ Decryption Flow │ │ │ │ User enters TOTP code (123456) │ │ │ │ ▼ │ │ Code valid ✓ ──► Derive key ──► AES-256-GCM decrypt │ │ ──► Plaintext │ │ │ └─────────────────────────────────────────────────────────┘
Configuration
Optional PIN
Add second layer protection:
# Set PIN authlock config --set-pin# Enable mandatory PIN authlock config --require-pin
# Now each decryption needs TOTP + PIN authlock open my-key --code 123456 --pin
Security Notes (安全说明)
⚠️ TOTP 授权隔离原则
每次解密都是独立事件,必须单独验证:
| 禁止 | 说明 |
|---|---|
| ❌ 复用 TOTP code | "刚才已经提供过 code 了" |
| ❌ 缓存 code | 将 code 存储起来后续使用 |
| ❌ 批量授权 | 一次 code 覆盖多次解密 |
| 必须 | 说明 |
| ------ | ------ |
| ✅ 每次独立询问 | 每次 open 都询问当前有效的 TOTP |
| ✅ 验证时效性 | TOTP 有效期约 30 秒,过期必须重新获取 |
| ✅ 即用即弃 | 解密后明文仅用于当前操作,不保留 |
用户请求解密 AUTHLOCK-xxx
↓
询问:"请提供当前有效的 TOTP code"
↓
用户提供 code (如: 123456)
↓
执行: authlock open xxx --code 123456
↓
使用明文执行操作 (SSH连接等)
↓
清除内存中的明文
重要: 即使对话中有过解密操作,下次请求时必须重新询问 TOTP code。
⛔ Absolute Prohibitions (绝对禁止事项)
Never echo plaintext password in conversation! (绝对不能在会话中回显明文密码!)
- Agent must never show decrypted plaintext in chat response
- Even with
--outputto file, don't echo file contents - Plaintext input during
sealoperation also shouldn't be echoed - To confirm success, only return "✅ Sealed/Decrypted", not content
Example (wrong vs correct):
❌ Wrong: Decryption successful, password: super_secret_password
✅ Correct: ✅ Decrypted to specified file
Session Security
- Decrypted result only for in-memory operations (SSH connection, DB connection)
- Not written to chat history
- Not written to session cache files
- Immediately clear plaintext from memory after operation
Other Security Notes
- TOTP seed safety: Seed stored in config file, backup carefully
- Time sync: Ensure accurate system time, TOTP depends on time
- Memory safety: Decrypted plaintext exists briefly in memory only
- Backup: Backup corresponding
~/.authlock/directory
Trigger Keywords
authlock, secret protection, TOTP encryption, MFA binding, password vault, certificate encryption
Secret Reference Convention
Use AUTHLOCK- format in documents to reference encrypted secrets.
Reference Format
AUTHLOCK-
| Reference Example | Actual Secret Name | Description |
|---|---|---|
AUTHLOCK-TEST-HELLO | test-hello | Test secret |
AUTHLOCK-DB-PASSWORD | db-password | Database password |
AUTHLOCK-PROD-SSH-KEY | prod-ssh-key | SSH private key |
- Reference uses uppercase letters and hyphens
- Actual secret name: remove
AUTHLOCK-prefix, convert to lowercase - Example:
AUTHLOCK-DB-PASSWORD→db-password
Agent Usage Flow
- Discover reference: Find
AUTHLOCK-xxxformat in document - Request verification: Ask user for current TOTP code
- Decrypt secret:
python3 /authlock_cli.py open --code - In-memory use: Keep decryption result in memory, no disk write
- Write file: Only when user explicitly specifies output path
Using in Documents
# Server Configuration- SSH Key: AUTHLOCK-PROD-SSH-KEY
- Database Password: AUTHLOCK-DB-PASSWORD
- API Token: AUTHLOCK-API-TOKEN
Security principles:
Decrypted result should not be written to disk- Agent should handle secret in memory only
- Only write to file when user explicitly specifies output path