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
相关产品推荐
相关产品推荐

