name: 密钥推导 description: 当用户询问“推导密钥”、“使用Type42”、“使用BRC-42”、“推导子密钥”、“使用BIP32”、“使用HD密钥”、“创建助记词”、“将助记词转换为密钥”、“推导BAP身份密钥”、“推导加密密钥”时,应使用此技能,或提及密钥推导、分层确定性钱包、发票编号或BSV上的子密钥生成。
BSV密钥推导
两种主要的BSV密钥推导方法,加上助记词支持。
快速参考
| 方法 | 包 | 用例 |
|---|---|---|
| Type42 (BRC-42) | @bsv/sdk |
现代:隐私保护、对方推导 |
| BIP32 (BRC-32) | @bsv/sdk |
传统:HD钱包、顺序路径 |
| 助记词 | @bsv/sdk |
种子短语到主密钥转换 |
1. Type42密钥推导(推荐)
使用ECDH共享秘密的现代方法。提供增强的隐私和无限密钥推导。
基本用法
import { PrivateKey, PublicKey } from "@bsv/sdk";
const masterKey = PrivateKey.fromWif("L1...");
const counterpartyPubKey = masterKey.toPublicKey(); // 或另一方的密钥
// 使用发票编号推导子密钥
const childKey = masterKey.deriveChild(counterpartyPubKey, "invoice-123");
const childAddress = childKey.toPublicKey().toAddress();
发票编号格式(BRC-43)
对于协议特定的推导,使用格式:{安全级别}-{协议}-{密钥ID}
// BAP身份签名密钥
const bapKey = masterKey.deriveChild(masterKey.toPublicKey(), "1-bap-identity");
// 加密密钥
const encKey = masterKey.deriveChild(masterKey.toPublicKey(), "2-encryption-default");
对方推导
Type42允许在不泄露私钥的情况下在各方之间推导共享密钥:
// Alice为Bob推导密钥
const aliceKey = PrivateKey.fromWif("L1...");
const bobPubKey = PublicKey.fromString("02...");
const sharedKey = aliceKey.deriveChild(bobPubKey, "payment-001");
// Bob使用他的私钥和Alice的公钥推导相同地址
const bobKey = PrivateKey.fromWif("K1...");
const alicePubKey = aliceKey.toPublicKey();
const bobDerived = bobKey.deriveChild(alicePubKey, "payment-001");
// bobDerived.toPublicKey().toAddress() === sharedKey.toPublicKey().toAddress()
关键优势
- 隐私:ECDH共享秘密防止地址重用检测
- 灵活性:任何字符串作为发票编号(无2^31限制)
- 可审计性:仅向特定方揭示共享秘密
- 无公共推导:相比BIP32增强安全性
2. BIP32 HD密钥推导(传统)
用于兼容性的传统分层确定性推导。
基本用法
import { HD } from "@bsv/sdk";
// 从扩展私钥
const hdKey = HD.fromString("xprv9s21ZrQH143K...");
// 在路径推导子密钥
const child = hdKey.derive("m/44'/0'/0'/0/0");
const address = child.pubKey.toAddress();
const privateKey = child.privKey;
路径格式
m= 主密钥- 数字 = 子索引(0到2^31-1)
- 撇号(
')= 硬化推导
// 标准钱包路径
const receiving = hdKey.derive("m/44'/236'/0'/0/0"); // BSV接收
const change = hdKey.derive("m/44'/236'/0'/1/0"); // BSV找零
// BAP身份路径
const bapRoot = hdKey.derive("m/424150'/0'/0'"); // 424150 = BAP十进制
从助记词
import { Mnemonic, HD } from "@bsv/sdk";
const mnemonic = Mnemonic.fromString("word1 word2 word3...");
const seed = mnemonic.toSeed();
const hdKey = HD.fromSeed(seed);
3. 助记词到单一主密钥
对于Type42,将助记词转换为单一主密钥(非扩展密钥):
import { Mnemonic, Hash, PrivateKey, Utils } from "@bsv/sdk";
const { toHex } = Utils;
const mnemonic = Mnemonic.fromString("dial tunnel valid cry exhaust...");
const seed = mnemonic.toSeed();
// SHA256种子产生256位私钥
const keyBytes = Hash.sha256(seed);
const masterKey = PrivateKey.fromString(toHex(keyBytes), "hex");
// 与Type42推导使用
const childKey = masterKey.deriveChild(masterKey.toPublicKey(), "bap:0");
这种方法:
- 保持熟悉的助记词备份
- 为Type42产生单一密钥(非HD扩展密钥)
- 与现有BIP39助记词兼容
选择方法
| 场景 | 推荐 |
|---|---|
| 新钱包/身份系统 | Type42 |
| 隐私保护支付 | Type42 |
| 对方密钥协议 | Type42 |
| 传统钱包兼容性 | BIP32 |
| 顺序地址生成 | BIP32 |
| 从现有HD钱包迁移 | 两者(见迁移) |
BAP身份密钥推导
BAP使用两级推导层次:
// 级别1:从路径的成员密钥
const memberKey = masterKey.deriveChild(masterKey.toPublicKey(), "bap:0");
// 级别2:使用BAP发票编号的身份签名密钥
const signingKey = memberKey.deriveChild(memberKey.toPublicKey(), "1-bap-identity");
const signingAddress = signingKey.toPublicKey().toAddress();
对于BIP32传统:
const memberHD = hdKey.derive("m/424150'/0'/0'/0/0/0");
// 然后应用Type42用于签名密钥
const signingKey = memberHD.privKey.deriveChild(memberHD.pubKey, "1-bap-identity");
安全考虑
- 从不暴露主密钥:为操作推导子密钥
- 使用硬化路径用于BIP32当隐私重要时(撇号)
- Type42防止公共推导:不能仅从父公钥推导子公钥
- 发票编号不保密:它们可以共享
bsv-bap库
bsv-bap库使用BRC-43发票编号为BAP身份实现Type42:
import { BAP } from "bsv-bap";
import { PrivateKey } from "@bsv/sdk";
const bap = new BAP({ rootPk: PrivateKey.fromRandom().toWif() });
const identity = bap.newId("Alice");
// 使用“1-bap-identity”推导的签名密钥
const { address, signature } = identity.signMessage(messageBytes);
// 使用“2-friend-{sha256(friendBapId)}”推导的朋友加密密钥
const friendPubKey = identity.getEncryptionPublicKeyWithSeed(friendBapId);
const ciphertext = identity.encryptWithSeed("secret", friendBapId);
CLI也可用:npm install -g bsv-bap(见**create-bap-identity**技能)。
官方规范
所有BSV密钥推导标准文档位于:
https://bsv.brc.dev/key-derivation
关键规范:
- BRC-42:Type42密钥推导方案
- BRC-32:BIP32 HD密钥推导
- BRC-43:安全级别、协议ID、密钥ID
- BRC-69:揭示密钥链接
- BRC-72:保护密钥链接信息
额外资源
参考文件
references/brc-42-type42.md- 完整Type42规范和高级模式references/brc-32-bip32.md- BIP32传统推导细节references/bap-derivation.md- BAP身份密钥推导模式和迁移
示例
examples/type42-derivation.ts- Type42对方密钥推导examples/bip32-wallet.ts- BIP32 HD钱包与标准路径examples/mnemonic-to-type42.ts- 将助记词转换为Type42主密钥