@ anywalletkit/种子-伏特
用于一个钱包密钥的加密备份文件:种子短语或私人密钥,正好与密钥环存储相同. 一个文件可以由一个或多个打开 保护者数字 :
安装
npm install @anywalletkit/seed-vault
# or: pnpm add @anywalletkit/seed-vault · yarn add @anywalletkit/seed-vault
时间: @ anywalletkit/种子-伏特发表于 发布工作流程 与出处.
| 保护者 | 打开它的东西 | 用它来 |
|---|---|---|
password | 通过 Argon2id 的密码( 默认为 19 MiB × 2, 至少 10 个字符) | ICloud Drive / Google Drive / 任何地方的文件 。 跨平台工作. |
key | 藏在别处的32字节的秘密 | 密码 PRF 输出, iCloud Keychain / Google Block Store 中的随机密钥, 硬件密钥的密钥 |
import { sealBackup, openBackup, addProtector, encodeBackup, decodeBackup } from '@anywalletkit/seed-vault'
const secret = await secrets.get(sourceId) // the keyring's stored string
const meta = { type: source.type, fingerprint: source.fingerprint, label: source.label }
const file = encodeBackup(await sealBackup(secret, meta, [{ kind: 'password', password }]))
// later, on any device
const opened = await openBackup(decodeBackup(file), { kind: 'password', password })
if (opened.meta.fingerprint !== expected) … // compare before writing anything
await secrets.set(sourceId, opened.text())
opened.dispose() // zeroizes the bytes
格式
- 有效载荷 : 该秘密曾被加密过一次,随机的32字节数据密钥(XChaCha20-Poly1305).
- 标题(格式,版本,创建-at,
meta)被认证为相关数据. - 更改文件中的指纹或标签使其无法打开( S)
corrupted) (中文(简体) ).
- 标题(格式,版本,创建-at,
- 保护者: 每个都用自己的密钥加密密钥来包裹相同的数据密钥,其描述符被认证.
- 降低文件中的Argon2成本,或者重命名一键,使得保护者失败.
- 更改保护者 :
addProtector编号 :removeProtector更改谁可以打开文件而不重新加密该秘密。 最后的保护者无法被移除 . - 解码 :
decodeBackup严格.- 它拒绝未知的格式,版本,密码或KDF,它只从已知的字段重建对象.
- 它约束了Argon2的成本(≤ 1 GiB,t 16),因此恶意文件不能耗尽手机的内存,并且拒绝一个低于SDK封装(19 MiB×2)的成本的密码保护者,因此一个廉价到brute-force文件从不作为普通备份.
- 密码 : NFKC-正态化,因此在不同的键盘上打出相同的密码句来打开文件.
电话速度
Argon2id默认在纯JS中运行,这总是有助于打开文件.
| 发动机 | 封口或开口(19 MiB x 2) |
|---|---|
| 赫尔墨斯 | 大约6-15 s |
| V8 / 节点 | 约0.15 s |
运行时显示本地自旋器 .
有了土生土长的Argon2id 你就能承受更大的代价了 过 { argon2id: nativeImpl, argon2: { m: 64 * 1024, t: 3, p: 1 } }。成本被存储在文件中,因此任何设备仍然可以打开它.
事实并非如此
- 它不会上传文件。 这是
backup-cloud。 。 。 . - 它不存储在设备上的秘密。 这是
@anywalletkit/secure-storage-react-native。 。 。 . - 它不会把秘密分成股份(Shamir). 这是作为额外保护者的计划.
- 它不使用 keytore v3(Ethereum JSON) 文件.