You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TweetNaCl.js ed25519签名在官方示例页验证报错问题排查

问题根因

你调用的nacl.sign()是TweetNaCl的「签名附加消息」接口,返回值为64字节Ed25519签名 + 原始消息内容拼接后的Uint8Array,总长度为64 + 消息字节数,并非官方示例要求的纯64字节独立签名。
官方示例的签名/验证模块默认使用独立签名模式,因此会出现长度不匹配的报错;官方用你提供的私钥生成的签名仅包含64字节签名内容,所以长度比你本地生成的更短。

修正方案

如果需要和官方示例逻辑对齐,改用nacl.sign.detached系列接口即可:

const keyPair = nacl.sign.keyPair();
const secretKey = keyPair.secretKey;
const publicKey = keyPair.publicKey;
const secretKeyB64 = encodeBase64(secretKey);
const publicKeyB64 = encodeBase64(publicKey);
console.log("secretKeyB64", secretKeyB64);
console.log("publicKeyB64", publicKeyB64);

const msgStr = "My unencrypted message";
const msg = decodeUTF8(msgStr);
// 生成独立64字节签名
const signature = nacl.sign.detached(msg, secretKey);
const signatureB64 = encodeBase64(signature);
console.log("signatureB64", signatureB64);
// 独立签名验证
const isVerified = nacl.sign.detached.verify(msg, signature, publicKey);
console.log("验证结果", isVerified);

修改后生成的signatureB64对应64字节纯签名,输入官方示例页即可正常完成验证。

补充说明

你原代码的逻辑本身没有错误,nacl.sign.open()就是专门处理「签名+消息」拼接格式的接口,因此你本地验证可以正常通过,只是和官方示例使用的接口模式不匹配。


内容的提问来源于stack exchange,提问作者Dana Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:15:03