TOTP Vault DocsDeployment & Recovery
TOTP VAULT · OPERATIONS GUIDE · v1.2.0

灾难恢复与离线解密

第九章 灾难恢复与离线解密

说明

标准恢复、无网站离线解密、离线导出全部 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。