Stronghold Procedures 完全参考:BIP39、SLIP10、Ed25519 签名等 20+ 密码学操作一览
【免费下载链接】stronghold.rsStronghold is a secret management engine written in rust.项目地址: https://gitcode.com/gh_mirrors/st/stronghold.rs
Stronghold 是一个用 Rust 编写的密钥管理引擎(secret management engine),它的核心抽象是Procedure(过程):每一种密码学操作都被封装成一个 Procedure,对加密保险库(Vault)中的秘密执行"生成、派生、使用"三类动作。本文带你快速扫完内置的全部 22 个 Stronghold Procedures——从 BIP39 助记词生成、SLIP10 密钥派生到 Ed25519 消息签名——并教你按场景挑选最合适的过程。
什么是 Procedure:Stronghold 密码学操作的统一抽象
每个 Procedure 都声明了自己的秘密来源 Location(source,Vault 中的记录位置)与写回位置(target),引擎保证秘密只在受保护的内存缓冲区中流转,不会以明文形式暴露给宿主应用。
按对秘密的作用,源码client/src/procedures/types.rs将过程抽象为三个 trait:
| Trait | 含义 | 典型场景 |
|---|---|---|
GenerateSecret | 生成全新秘密并写入保险库 | BIP39 助记词生成 |
DeriveSecret | 用现有秘密派生出新秘密 | SLIP10 派生、HKDF |
UseSecret | 使用秘密,只返回公开输出 | Ed25519 签名、HMAC |
全部 22 个具体过程集中定义在client/src/procedures/primitives.rs中,并统一收敛为StrongholdProcedure枚举(第 40~65 行)。
22 个 Stronghold Procedures 速查表
| 分类 | 过程 | 它做什么 |
|---|---|---|
| 📦 保险库管理 | WriteVault | 把任意数据写入指定 Location |
RevokeData | 吊销(标记删除)一条记录,可自动 GC | |
GarbageCollect | 物理清理已吊销记录 | |
CopyRecord | 将秘密从一个 Location 复制到另一个 | |
| 🧠 助记词与种子 | BIP39Generate | 生成 BIP39 助记词,种子存入保险库 |
BIP39Recover | 由助记词恢复种子(支持 passphrase) | |
Slip10Generate | 直接生成原始 SLIP10 种子(默认 64 字节) | |
| 🔑 密钥派生 | Slip10Derive | 从种子或父密钥派生子密钥,返回链码 |
Hkdf | HKDF 密钥扩展(SHA-256/384/512) | |
ConcatKdf | NIST SP 800-56A 5.8.1 拼接 KDF | |
| 🔐 签名与公钥 | GenerateKey | 随机生成 Ed25519 / X25519 密钥 |
PublicKey | 由私钥计算 32 字节公钥 | |
Ed25519Sign | 用 Ed25519 密钥签名,输出 64 字节签名 | |
| 🤝 密钥交换 | X25519DiffieHellman | ECDH 协商共享秘密并写入保险库 |
| 🔒 对称加密 | AeadEncrypt | AES-256-GCM 或 XChaCha20-Poly1305 加密 |
AeadDecrypt | 对应解密,校验认证标签 | |
AesKeyWrapEncrypt | 用库内另一把密钥包裹密钥(AES-256-KW) | |
AesKeyWrapDecrypt | 解包裹密钥并写入指定 Location | |
| 🧮 KDF / MAC | Pbkdf2Hmac | PBKDF2 密码派生(HMAC-SHA2/384/512) |
Hmac | 用库内密钥计算 HMAC 消息认证码 | |
| ✂️ 秘密操作 | ConcatSecret | 拼接两个秘密为新的秘密 |
| ⚠️ 非安全特性 | CompareSecret | 比较秘密与期望值(仅 insecure 特性) |
BIP39 助记词:生成与恢复
BIP39Generate:生成 32 字节随机熵,编码为 24 词助记词(支持英文/日文词表),64 字节种子存入 Vault,助记词作为明文输出交给用户备份;可选 passphrase 保护。BIP39Recover:由助记词 + passphrase 恢复种子并写入保险库,用于换设备迁移。实现上对助记词与口令做了zeroize清零,避免在内存中残留。
SLIP10 派生与 Ed25519 签名工作流
Slip10Generate:不借助助记词直接生成随机种子(默认 64 字节/512 位)。注意:走这条路后无法再反推出助记词,需要助记词请改用BIP39Generate。Slip10Derive:输入Slip10DeriveInput::Seed或::Key加派生路径Chain,子密钥写入 output Location,并返回对应的ChainCode。Ed25519Sign:只要私钥记录的前 32 字节是 Ed25519 密钥材料即可直接签名——SLIP10 派生出的密钥完全兼容,密钥全程不出保险库。GenerateKey/PublicKey:面向非层级化场景,直接生成密钥(KeyType::Ed25519/KeyType::X25519)并计算公钥。
加密、密钥交换与密钥包裹
X25519DiffieHellman:本地 X25519 私钥 × 对端公钥 → 共享秘密写入保险库,是 P2P 安全通道的起点。AeadEncrypt/AeadDecrypt:AEAD 加密(AES-256-GCM 或 XChaCha20-Poly1305),需 nonce 与 associated_data;加密输出为 tag + 密文拼接。AesKeyWrapEncrypt/AesKeyWrapDecrypt:用库内密钥"包裹"另一把密钥(AES-256-KW),是构建密钥层级的常用模式。Pbkdf2Hmac:从口令经 PBKDF2(指定盐与迭代次数)派生密钥。Hmac:用库内密钥计算 HMAC-SHA256/384/512 消息认证码。
如何选对 Procedure:场景速配清单 🎯
- 需要助记词备份?→
BIP39Generate/BIP39Recover;不需要则Slip10Generate更轻量。 - 多账户/多路径派生→
Slip10Derive+Ed25519Sign。 - P2P 安全信道→
X25519DiffieHellman→ConcatKdf派生会话密钥 →AeadEncrypt加密数据。 - 口令场景→
Pbkdf2Hmac;密钥层级→AesKeyWrapEncrypt/Decrypt。 - 清理旧密钥→
RevokeData(should_gc = true自动清理)或单独执行GarbageCollect。 - ⚠️
CompareSecret仅编译insecure特性时存在,源码明确标注禁止用于生产环境。
关键源码与测试位置
- 22 个过程的具体定义:
client/src/procedures/primitives.rs - 三大 trait 抽象(GenerateSecret / DeriveSecret / UseSecret):
client/src/procedures/types.rs - 引擎桥接实现(Runner / ClientRunner):
client/src/procedures/clientrunner.rs - Location(Vault 路径 + 记录 ID)定义:
client/src/types/location.rs - 过程行为测试:
client/src/tests/procedure_tests.rs - 快速上手指南:
client/README.md
【免费下载链接】stronghold.rsStronghold is a secret management engine written in rust.项目地址: https://gitcode.com/gh_mirrors/st/stronghold.rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考