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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:57:58