hashsigs-ts快速上手教程:3行TypeScript代码跑出第一个WOTS+哈希签名
【免费下载链接】hashsigs-tsHash-based signatures in typescript, WOTS+项目地址: https://gitcode.com/gh_mirrors/ha/hashsigs-ts
想亲手体验抗量子计算的哈希签名吗?本文带你用 hashsigs-ts 这个 TypeScript 哈希签名库,3 行代码完成第一个 WOTS+(Winternitz One-Time Signature Plus)签名与验签,全程不超过 5 分钟 🚀
为什么关注 WOTS+ 哈希签名?
- 抗量子安全:WOTS+ 属于基于哈希的签名(Hash-based Signatures),安全性只依赖哈希函数的单向性,不受量子计算机破解大数分解/离散对数的威胁,是后量子密码学的热门方向 🔒
- 一次一签,极致简单:它属于一次性签名方案,签名即"消耗"一次私钥的使用额度,逻辑纯粹、易审计
- 纯 TypeScript 实现:hashsigs-ts 核心代码集中在 src/wotsplus.ts,运行时仅依赖轻量哈希库
@noble/hashes,浏览器、Node、边缘环境都能跑
⚠️ 一次性签名意味着同一个私钥只能签一条消息。要签多条消息,需要配合 XMSS 等树结构方案来管理多套一次性密钥。
一键安装 hashsigs-ts
npm install hashsigs-ts如果你还想阅读源码或跑测试,可以直接克隆仓库:
git clone https://gitcode.com/gh_mirrors/ha/hashsigs-ts项目入口导出在 src/index.ts,WOTSPlus类和HashFunction类型均从此处导出。
3行代码:生成密钥 → 签名 → 验签
下面是完整可运行的最小示例(核心逻辑就是 3 行):
import { WOTSPlus } from 'hashsigs-ts'; import { keccak_256 } from '@noble/hashes/sha3'; const wotsPlus = new WOTSPlus(keccak_256); // 准备两个 32 字节种子(可理解为私钥种子和公开种子) const privateSeed = keccak_256(new TextEncoder().encode('my secret seed')); const publicSeed = keccak_256(new TextEncoder().encode('my public seed')); const message = keccak_256(new TextEncoder().encode('Hello WOTS+!')); // ① 生成密钥对 ② 签名 ③ 验签 const { publicKey, privateKey } = wotsPlus.generateKeyPair(privateSeed, publicSeed); const signature = wotsPlus.sign(privateKey, publicSeed, message); const isValid = wotsPlus.verify(publicKey, message, signature); // ✅ true三个方法各司其职:
| 步骤 | 方法 | 作用 |
|---|---|---|
| ① 生成密钥 | generateKeyPair | 由私钥种子 + 公开种子推导出 32 字节私钥和 64 字节公钥 |
| ② 签名 | sign | 把消息转成 w 进制索引,在哈希链上取对应位置,输出 67 段签名 |
| ③ 验签 | verify | 从签名位置继续推链,还原公钥分段并比对,返回布尔值 |
WOTS+ 参数速查表
new WOTSPlus(hashFn, hashLen?, chainLen?)的默认与约束如下(参数推导见 构造函数):
| 参数 | 默认值 | 说明 |
|---|---|---|
hashLen | 32 字节 | 哈希输出长度,Keccak-256 正好 32 字节 |
messageLen | 32 字节 | 必须传入哈希后的消息,不是原文长度 |
chainLen(w) | 16 | 哈希链长度,只允许 4 或 16(XMSS 兼容约束,见 validateParameters) |
| 公钥大小 | 64 字节 | 公开种子 + 公钥分段哈希 |
| 签名大小 | 2144 字节 | 67 段 × 32 字节(64 个消息分段 + 3 个校验和分段) |
💡 一句话记忆:w越大签名越小但计算越慢,16 是官方测试向量采用的默认值。
验证你的实现:跑一遍测试向量
仓库自带与 Keccak-256 配套的 JSON 测试向量,覆盖密钥、公钥分段、消息与完整签名:
- 测试向量数据:test/test_vectors/wotsplus_keccak256.json
- 测试用例:src/wotsplus.test.ts 中逐条调用
verify与verifyWithRandomizationElements双通道校验
克隆仓库后执行:
npm install # 安装依赖 npm test # 运行 Vitest 测试 npm run coverage # 查看覆盖率报告(阈值 80%,配置见 [vitest.config.ts](https://link.gitcode.com/i/4cf4881c609fe91edc076ea78a485a74))常见问题(FAQ)
Q:为什么 message 必须恰好 32 字节?A:WOTS+ 只对定长输入签名,messageLen = hashLen = 32。签名前先对任意长度的原文做一次keccak_256即可,这也是示例里先哈希原文的原因。
Q:私钥长度不对会怎样?A:sign 会直接抛出private key length must be 32 bytes,属于快速失败设计,便于排查。
Q:verify 和 verifyWithRandomizationElements 有什么区别?A:两者验签逻辑一致;后者允许你传入预先计算好的随机化元素(r序列),省去重复生成开销,适合批量验签场景,源码见 verifyWithRandomizationElements。
Q:可以直接签多条消息吗?A:不能。WOTS+ 是一次性签名,同一私钥复用会导致私钥泄露。多消息场景请搭配 XMSS 类树形方案。
项目结构一览
hashsigs-ts/ ├── src/ │ ├── index.ts # 包入口,导出 WOTSPlus │ ├── wotsplus.ts # WOTS+ 核心实现(密钥/签名/验签) │ └── wotsplus.test.ts # Vitest 测试用例 ├── test/ │ └── test_vectors/ │ └── wotsplus_keccak256.json # Keccak-256 官方风格测试向量 ├── package.json # npm 包 @quip.network/hashsigs ├── tsup.config.ts # 构建 CJS + ESM 双格式产物 └── vitest.config.ts # 测试与覆盖率配置写在最后
hashsigs-ts 用不到 400 行 TypeScript 把后量子密码里著名的 WOTS+ 算法讲得明明白白:生成密钥、签名、验签 三步,配合 JSON 测试向量 就能完成从"读代码"到"跑通"的完整闭环。现在就去npm install hashsigs-ts,打出你的第一个哈希签名吧 ✍️
许可说明:本项目采用 AGPL-3.0-or-later 开源协议(全文见 COPYING),商用前请留意其网络副本条款。
【免费下载链接】hashsigs-tsHash-based signatures in typescript, WOTS+项目地址: https://gitcode.com/gh_mirrors/ha/hashsigs-ts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考