cedws/amnesia
GitHub: cedws/amnesia
amnesia 是一个利用 Shamir 秘密共享算法和问答机制来封存及恢复机密信息的命令行工具,旨在帮助用户在忘记密码时通过生活细节找回主密码。
Stars: 24 | Forks: 1
# amnesia
amnesia 是一个命令行工具,用于通过一组问题来封存机密,并指定解密该机密所需的正确答案数量。它在底层使用 argon2id 和 [Shamir's Secret Sharing](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing)。
我一直在思考,如果遭受失忆并忘记所有密码,我该如何恢复我的数字生活。*amnesia* 背后的理念是,我可以使用一组关于我生活的问题来封存一个主密码,即使失忆我也能回答这些问题,并使用该主密码来恢复其他所有信息。
## 工作原理
在封存机密时,用户需要提供一组问题和答案,以及一个阈值。阈值是必须正确回答的问题数量,才能解封机密,且至少为 2。在封存机密之前,系统会提示用户进行测试问答,以确保问题和答案已正确输入。
## 演示

## 安装
### Brew
```
brew install cedws/tap/amnesia
```
### Scoop
```
scoop bucket add cedws https://github.com/cedws/scoop-bucket.git
scoop install amnesia
```
### Go
```
go install github.com/cedws/amnesia@latest
```
## 使用
为了强力保护机密,请输入大量难题。例如,可以将您最近使用的五个密码作为问题输入。
答案在密钥派生中将按原样使用,因此请注意大小写和标点符号的使用。
### 封存机密
```
# 加密一个 secret,输出到 stdout
echo "my-master-password" | amnesia seal
# 将一个 secret 加密到文件
echo "my-master-password" | amnesia seal -o sealed.json
# 跳过测试问题进行加密
echo "my-master-password" | amnesia seal -o sealed.json -t
```
### 解封机密
```
# 解密一个 secret,输出到 stdout
amnesia unseal -f sealed.json
# 将一个 secret 解密到文件
amnesia unseal -f sealed.json -o secret.txt
```
### 重新封存机密
重新封存允许您在保持相同问题和答案的情况下,替换现有封存文件中的加密机密。您必须提供正确答案以派生加密密钥。
```
# 使用新的 secret 重新加密,输出到 stdout
echo "new-master-password" | amnesia reseal -f sealed.json
# 使用新的 secret 重新加密到文件
echo "new-master-password" | amnesia reseal -f sealed.json -o resealed.json
```
### 打开机密进行编辑
将封存的机密打开为文件以进行编辑。按 Ctrl+C 可重新封存修改后的内容。退出时将删除机密文件。
```
amnesia open -f sealed.json -o secret.txt
```
## age 插件(实验性)
amnesia 实验性地支持作为身份插件集成到 [age](https://github.com/FiloSottile/age) 中。amnesia 可以生成受问题密封的与 *age* 兼容的 X25519 身份。当 age 需要使用此身份解密数据时,它将提示用户输入所需答案以解封该身份。
要将 amnesia 安装为 *age* 插件,请在您的 PATH 中创建一个符号链接,将 `age-plugin-amnesia` 指向 amnesia。您也可以直接克隆二进制文件。如果您是通过 brew 安装的 amnesia,则无需执行任何操作。
```
ln -s amnesia age-plugin-amnesia
# OR (不推荐)
cp amnesia age-plugin-amnesia
```
要生成与 *age* 兼容的身份,请运行:
```
amnesia age-keygen
```
这将交互式提示输入用于封存身份的问题,并输出类似以下内容:
```
# created 2025-07-16T23:55:59+09:00
# public key: age1enfsyp6vug3l4xt65jysvlpl076xkw4cxup89rmteakfzre8uajqlnya3u
AGE-PLUGIN-AMNESIA-10V9ZQGPZWEJHYUMFDAHZYW3QYGCJYTQ2YQSZYUM9V9KX2EZLW35K6ETNW3SK6UPZ8GSZYV3SXG6J6VPH95CNV4PJXVAR2DF6X5UJKVPE8GCRQG3VPGSZQGNNDPSHYETNYGAZQKC2YQSZQGRMPGSZQGPQYQSZY6TYYGAZQVPVPGSZQGPQYQSZYUT4V4EHG6T0DC3R5GPZDESK6EFZ9S9ZQGPQYQSZQGNNV9K8GG36YQ3YSN2EF5MKKD6JFATK632FFEFHYVZ3WD4NV5NR2G6NJ5R9DSUN2WT42FT9WAPH2FXKYTMN853ZCZ3QYQSZQGPQYFEKSCTJV53R5GPZ29VNSDF5DA4RVC2HXP4XSJNKG36XX3N5GAZHV5PNXAPRQKNSXEXRXC26V9F8G6TFWFHYU7NTW39YWD2VVAX9Y6TV2YU42S2YW49KYJFSGY7N6GS2YQSZQGRA9S9ZQGPQYPAS5GPQYQSZQGPZD9JZYW3QXYKQ5GPQYQSZQGPZW96K2UM5D9HKUG36YQ3XZEM9YGKQ5GPQYQSZQGPZWDSKCAPZ8GSZYK3EVFJ9V635W9XKYJT8WDYYX6TND4EXKN6RGA28YMJ5VD9YV73HWDU57UM02A2KS6N4VV7JYTQ2YQSZQGPQYQ38X6RPWFJJYW3QYF6KJ6RKW39XVJE5W9SH5S2GDEX5Y3PETPJNVET3VAZ5CJ2Y8P6XCUR4WGHKUJMS2EA926602FZ8S3RXXV69Q43ND46NQMNCD934J3NDX3GN60FZPGSZQGPQ059ZQGZA9S9ZQGPZV4HXXUNEWP6X2EPZ8GSZYW23T9M5XKZX2F68SJECFC45KMMC2434Z6J6W3GYKKR5TQ45S4MYVDC5C3T3G4RXUNN9TFC8J7PCD9C4G7Z5VEQNSVR3TG6KS4MKDDK5WDNGXPHH56M30FFRZ5T62PCY6CTR0P8575P3DUHNSU6VWAHHVU6G23TKVE30FPVJ766P24E95V6JTFDXYNMGV4U8QCMXWEKYVDNG2E2RXVTVF3MXJ3PZPF7SMZA27H
```
公钥是“收件人”,可以与任何人共享。您可以像这样使用它来加密数据:
```
echo "secret" | age -r age1enfsyp6vug3l4xt65jysvlpl076xkw4cxup89rmteakfzre8uajqlnya3u > secret.enc
```
以 `AGE-PLUGIN-AMNESIA-...` 开头的那一行是“身份”。这是一个加密的 X25519 密钥,只有对输入的问题提供足够数量的答案才能解封。
您可以像这样使用该身份解密数据:
```
age --decrypt -i identity.txt secret.enc
```
这将通过 *age* 交互式提示输入答案。
## 密码学
amnesia 中使用的密码学技术包括 argon2id、AES-CTR、AES-GCM 和 [Shamir's Secret Sharing](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing)。
1. 生成一个 32 字节的 DEK(数据加密密钥)
2. 使用 Shamir's Secret Sharing 将 DEK 拆分为 N 个共享,其中 N 是问题的数量
3. 使用 argon2id KDF 从每个答案派生一个 32 字节的 KEK(密钥加密密钥)
4. 使用 AES-CTR 和答案 KEK 加密 DEK 的每个共享
5. 加密后的共享与相应的问题一起存储
6. 使用 AES-GCM 和 DEK 加密机密
这种使用 DEK 加密机密并通过 SSS 将 DEK 拆分为多个部分的混合方法,意味着可以以最小的开销保护非常大的机密。
标签:Argon2id, CLI, EVTX分析, Go语言, Shamir算法, WiFi技术, 主密码保护, 二进制发布, 加密工具, 安全存储, 密码遗忘, 密钥派生, 开源工具, 操作系统检测, 日志审计, 秘密共享, 程序破解, 记忆恢复, 门限密码