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

NodeJS Sign.sign()签名与OpenSSL签名C#验证不一致问题求助

问题解决:NodeJS生成的签名无法被C#验证,而OpenSSL生成的可以

核心原因

你遇到的问题不是换行或末尾空行导致的,而是两者输出的文件格式本质不同:

  • OpenSSL先生成二进制签名文件(test.txt.sign),再转成带换行的Base64文本;
  • NodeJS直接输出Base64格式的文本文件,而你的C#代码是直接读取二进制签名文件进行验证,没有对NodeJS生成的Base64文本做解码。

解决方案

方案1:NodeJS直接生成二进制签名(和OpenSSL输出格式一致)

修改NodeJS代码,不指定"base64"编码,直接保存二进制签名数据,这样C#代码无需修改就能验证:

const sign = () => {
  const fData = fs.readFileSync("test.txt");
  const sign = crypto.createSign("SHA256");
  sign.update(fData);
  // 不指定编码,返回Buffer类型的二进制数据
  const signatureBuffer = sign.sign({
    key: getPrivateKey(),
    passphrase: "pass",
  });
  fs.writeFileSync("test.txt.sign", signatureBuffer);
};

方案2:C#读取Base64文本后解码验证

如果需要保留NodeJS生成的Base64格式文件,修改C#代码,先读取Base64文本并解码为二进制签名,再进行验证:

var key = File.ReadAllBytes(@"C:\Entwicklung\NodeJS\test-crypto\my_rsa.pem");
var rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(key);

// 读取Base64签名文本,解码为二进制
var base64SignText = File.ReadAllText(@"C:\Entwicklung\NodeJS\test-crypto\license.txt.sign.base64");
var signature = Convert.FromBase64String(base64SignText);

var data = File.ReadAllBytes(@"C:\Entwicklung\NodeJS\test-crypto\test.txt");
var sha256 = new SHA256Managed();
var hash = sha256.ComputeHash(data);
var result = rsa.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA256"), signature);
Console.WriteLine(result);

补充说明

Base64格式中的换行、末尾空行属于格式美化,解码时会被自动忽略,所以这些字符不会影响签名的有效性。问题的本质是数据格式不匹配:C#需要二进制签名,而NodeJS最初输出的是Base64文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:10:33