灾难恢复与离线解密
第九章 灾难恢复与离线解密
说明标准恢复、无网站离线解密、离线导出全部 Secret 与被入侵后的恢复策略。
#44. 标准备份恢复
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
从 OneDrive 下载:
totp-vault-YYYYMMDD-HHMMSS.tar.gz.age
准备:
AGE Private Key
该文件 SHA256
上传到隔离恢复服务器:
/tmp/backup.age
/tmp/totp-vault-age-private-key.txt
权限:
chmod 600 /tmp/totp-vault-age-private-key.txt
恢复:
cd /www/wwwroot/2fa.example.com
PHP_BINARY=/www/server/php/82/bin/php bash scripts/restore.sh \
/tmp/backup.age \
/tmp/totp-vault-age-private-key.txt \
这里填写64位SHA256
输入:
RESTORE
完成后:
/www/server/php/82/bin/php artisan totp:test
/www/server/php/82/bin/php artisan totp:health --online
删除服务器临时 AGE Private Key:
shred -u /tmp/totp-vault-age-private-key.txt 2>/dev/null || rm -f /tmp/totp-vault-age-private-key.txt
#45. 不搭网站:直接解密 OneDrive 备份
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
适用:
网站完全被黑
无法运行 Web 服务
只想救出全部账号与 TOTP Secret
最终发布包提供:
tools/offline-export.php
整个过程不需要 Nginx、宝塔、域名、管理员登录或 Microsoft OAuth。
#46. Windows 解开 AGE 外层
Windows PowerShell🪟 执行位置:你自己的 Windows 电脑 PowerShell
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
从 OneDrive 下载:
totp-vault-YYYYMMDD-HHMMSS.tar.gz.age
保存:
D:\SoftWare\Age\Restore\backup.tar.gz.age
创建目录:
New-Item -ItemType Directory -Force -Path "D:\SoftWare\Age\Restore"
验证 SHA256:
Get-FileHash "D:\SoftWare\Age\Restore\backup.tar.gz.age" -Algorithm SHA256
和网站备份记录中的 SHA256 对比。
解密:
& "D:\SoftWare\Age\Extracted\age\age.exe" `
--decrypt `
--identity "D:\SoftWare\Age\PrivateKey\totp-vault-age-private-key.txt" `
--output "D:\SoftWare\Age\Restore\backup.tar.gz" `
"D:\SoftWare\Age\Restore\backup.tar.gz.age"
查看归档:
tar -tzf "D:\SoftWare\Age\Restore\backup.tar.gz"
必须只有:
database.sqlite
vault.key
config.json
manifest.json
解压:
New-Item -ItemType Directory -Force -Path "D:\SoftWare\Age\Restore\Extracted"
tar -xzf "D:\SoftWare\Age\Restore\backup.tar.gz" -C "D:\SoftWare\Age\Restore\Extracted"
得到:
D:\SoftWare\Age\Restore\Extracted\database.sqlite
D:\SoftWare\Age\Restore\Extracted\vault.key
D:\SoftWare\Age\Restore\Extracted\config.json
D:\SoftWare\Age\Restore\Extracted\manifest.json
#47. 为什么 database.sqlite 不能直接看到 Secret
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
数据库只保存:
secret_ciphertext
secret_nonce
每条 TOTP Secret 使用:
XChaCha20-Poly1305
vault.key
AAD = totp-entry:{entry-id}
因此必须同时有:
database.sqlite
vault.key
才能解密。
#48. 无网站离线导出全部 Secret:推荐使用干净 Ubuntu/WSL
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
在一台可信干净 Ubuntu/WSL 环境:
sudo apt update
sudo apt install -y php-cli php-sqlite3 php-common
检查:
php -v
php -m | grep -Ei 'pdo_sqlite|sodium'
必须看到:
pdo_sqlite
sodium
把最终代码包中的:
tools/offline-export.php
复制到安全目录。
把刚才解出的:
database.sqlite
vault.key
一起放入安全目录。
执行:
php offline-export.php \
--database=/safe/database.sqlite \
--vault-key=/safe/vault.key \
--output=/safe/totp-vault-decrypted.json \
--csv=/safe/totp-vault-entries.csv \
--uris=/safe/totp-vault-otpauth.txt
输出:
totp-vault-decrypted.json
totp-vault-entries.csv
totp-vault-otpauth.txt
totp-vault-otpauth.txt 每行一个 otpauth:// URI,可在新 TOTP Vault 的“批量导入”页面直接粘贴。
包含:
平台
账号
Issuer
明文 TOTP Secret
Algorithm
Digits
Period
Notes
Tags
Favorite
otpauth URI
管理员 MFA Secret(如果启用)
网站 settings
backup_records
audit_logs
login_attempts
不会包含:
Microsoft Client Secret
Access Token
Refresh Token
secure-store.enc
因为 secure-store.enc 本来就不在 AGE 数据备份中。
#49. 离线导出文件安全处理
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
离线导出的:
totp-vault-decrypted.json
totp-vault-entries.csv
已经包含所有明文 TOTP Secret。
只能保存到:
BitLocker 加密磁盘
加密 U 盘
完全离线恢复环境
用完删除:
Linux:
shred -u /safe/totp-vault-decrypted.json 2>/dev/null || rm -f /safe/totp-vault-decrypted.json
shred -u /safe/totp-vault-entries.csv 2>/dev/null || rm -f /safe/totp-vault-entries.csv
shred -u /safe/totp-vault-otpauth.txt 2>/dev/null || rm -f /safe/totp-vault-otpauth.txt
SSD/现代文件系统的 shred 不保证物理块完全擦除,所以最可靠的是整个恢复目录放在加密卷里,使用后删除加密卷或销毁其密钥。
#50. 网站被黑后的推荐恢复方式
服务器 SSH / 终端🖥️ 执行位置:服务器 SSH / 终端
下方命令块可以直接复制;带“检查/预期”的内容用于核对结果,不要当作命令输入。
如果确认服务器可能已经被入侵,不建议简单复制旧服务器所有运行文件继续使用。
推荐:
1. 断开旧服务器公网
2. 保留取证快照
3. 从 OneDrive 下载最近一次确认正常的 .age 备份
4. 在可信离线环境解密/检查
5. 新服务器从最终源码重新部署
6. 生成新的 vault.key
7. 使用离线导出的 `totp-vault-otpauth.txt` 在新后台“批量导入”,让所有 Secret 用新 vault.key 重新加密
8. 重置管理员密码与管理员 MFA
9. 在 Entra 删除旧 Client Secret,创建新 Client Secret
10. 重新执行 Microsoft OAuth 授权
11. 视风险生成新的 AGE Key Pair
12. 新系统首次成功备份后再恢复对外服务
如果只做灾难恢复而没有证据表明密钥泄露,可以使用标准 restore 保留原 vault.key。
如果明确怀疑:
vault.key
secure-store.enc
已经被攻击者拿走,应按“新 Vault + 重新导入 Secret”方式轮换,而不是继续使用旧 vault.key。