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

