在 C# 中验证由 Crypto Node.JS 创建的 RSA 签名
Verifying a RSA signature made by Crypto Node.JS in C#
我正在尝试使用 Express/NodeJS 来构建 Web 服务,它会签署一条信息。签名数据由用 C# 编写的客户端接收和验证。请原谅我在密码学及其相关技术方面缺乏经验。
首先,我为 C# 客户端 生成一个 证书 和一个 私钥 对于 NodeJS 应用程序 使用 OpenSSL;
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
是从 [=14= 返回的数据] 在NodeJS应用中,只是从Base64转为byte数据。
插入所有信息后,VerifyData()
returns 错误,这使我相信 Web 服务和客户端的加密配置之间存在某种不匹配。
有什么想法吗?
正如评论中所指出的,问题是当 NodeJS 应用程序中的数据从 UTF-8 读取时,C# 客户端中的 data
被转换为 Base64。
解决方案是使用 Encoding.UTF8.GetBytes()
转换字符串
感谢您的快速回复!
我正在尝试使用 Express/NodeJS 来构建 Web 服务,它会签署一条信息。签名数据由用 C# 编写的客户端接收和验证。请原谅我在密码学及其相关技术方面缺乏经验。
首先,我为 C# 客户端 生成一个 证书 和一个 私钥 对于 NodeJS 应用程序 使用 OpenSSL;
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
是从 [=14= 返回的数据] 在NodeJS应用中,只是从Base64转为byte数据。
插入所有信息后,VerifyData()
returns 错误,这使我相信 Web 服务和客户端的加密配置之间存在某种不匹配。
有什么想法吗?
正如评论中所指出的,问题是当 NodeJS 应用程序中的数据从 UTF-8 读取时,C# 客户端中的 data
被转换为 Base64。
解决方案是使用 Encoding.UTF8.GetBytes()
感谢您的快速回复!