在Node.js中如何使用crypto.createSign()搭配ED25519密钥实现数据签名?
在Node.js中如何使用crypto.createSign()搭配ED25519密钥实现数据签名?
嘿,你这是踩了ED25519和RSA/DSA签名的一个关键区别的坑啦!ED25519是一种自带哈希逻辑的确定性签名算法,它的规范里已经固定用SHA-512来处理消息了,根本不需要像RSA那样额外指定哈希算法——这就是你碰到invalid digest错误的核心原因。
为什么之前RSA/DSA可以,ED25519不行?
RSA、DSA这类算法的逻辑是“先把消息哈希成固定长度的摘要,再对摘要签名”,所以必须指定哈希算法;但ED25519把哈希和签名的步骤直接整合在一起了,底层会自动完成SHA-512哈希,你要是硬给它加个哈希算法,反而会触发“无效摘要”的错误。
正确的实现方法
首先得确保你手里的是正经的ED25519私钥,要是没有的话,可以用下面的代码生成一对:
const { generateKeyPairSync } = require('crypto'); // 生成符合要求的ED25519密钥对 const { privateKey, publicKey } = generateKeyPairSync('ed25519', { publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' } });
然后用createSign签名的正确写法是这样的:
const { createSign } = require('crypto'); const sign = createSign('ed25519'); // 直接写ed25519就行,不用加哈希 sign.update('<sensitive data here>'); sign.end(); const signature = sign.sign(privateKey);
嫌麻烦的话,也可以用更简洁的crypto.sign()直接签名:
const { sign } = require('crypto'); const signature = sign('ed25519', '<sensitive data here>', privateKey);
几个要注意的点
- Node.js版本别太老:ED25519在Node.js的
crypto模块里稳定支持是从v16.0.0开始的,版本太低的话可能会出问题。 - 私钥格式要对:必须用PKCS8格式的PEM(或者DER),要是你的私钥是旧的OpenSSH格式,得先转成PKCS8才能用。
- 别画蛇添足加哈希:不管是
createSign还是crypto.sign(),第一个参数就写'ed25519',什么ed25519-sha256这种写法根本不存在,只会报错。
备注:内容来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

