☰
hashsigs-ts快速上手教程:3行TypeScript代码跑出第一个WOTS+哈希签名
2026/10/16 13:48:31 网站建设 项目流程

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?)的默认与约束如下(参数推导见 构造函数):

参数默认值说明
hashLen32 字节哈希输出长度,Keccak-256 正好 32 字节
messageLen32 字节必须传入哈希后的消息,不是原文长度
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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询