繁体   English   中英

在 C# 中验证 Crypto Node.JS 生成的 RSA 签名

[英]Verifying a RSA signature made by Crypto Node.JS in C#

我正在尝试使用对一条信息进行签名的Express/ NodeJS 构建 web 服务。 签名数据由用C#编写的客户端接收和验证。 您将不得不原谅我在密码学及其相关技术方面的经验不足。

首先,我为C# 客户端生成证书,并使用OpenSSL为 NodeJS应用程序生成私钥

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

NodeJS 应用程序中,我有以下代码;

const crypto = require('crypto')
const fs = require('fs')

var pem = fs.readFileSync('./keys/key.pem');
var key = pem.toString('ascii');
var privateKey = crypto.createPrivateKey({
    'key': key,
    'format': 'pem',
    'passphrase': '<PASSPHRASE>',
});

function sign(identifier){
    var sign = crypto.createSign('RSA-SHA256');
    sign.update(identifier);
    var sig = sign.sign(privateKey, 'base64');
    return sig;
}

exports.sign = sign;

在这种情况下,参数identifier是要签名的数据。 客户端将收到此信息以及生成的签名sig

在 C# 客户端中,我有以下代码段;

X509Certificate2 cert = new X509Certificate2(Convert.FromBase64String(pub));
using (var sha256 = SHA256.Create())
{
    using (var rsa = cert.GetRSAPublicKey())
    {
        bool results = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
        Console.WriteLine(results.ToString());
    }
}

pub是 Base64 中生成的证书,它存储在const string中。 data包含与 NodeJS 应用程序中的identifier相同的信息,但它使用Convert.FromBase64String(...)转换为字节,同样signature是 NodeJS 应用程序中从sig返回的数据,仅从 Base64 转换为字节数据.

插入所有信息后, VerifyData()返回 false,这使我相信 web 服务和客户端的加密配置之间存在某种不匹配。

有任何想法吗?

正如评论中所指出的,问题是当 NodeJS 应用程序中的data从 UTF-8 读取时,C# 客户端中的数据从 Base64 转换为。

解决方案是使用Encoding.UTF8.GetBytes()转换字符串

感谢您及时的回复!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM