在JavaScript vs c#中签名为我提供了不同的答案



我在c#中具有代码,而javaScript中的等效代码,但是它们正在输出不同的值,他们使用相同的私钥和字符串来签名。谁能告诉我这里有什么问题:

javascript(使用jsrsa.js库)

let requestStringToSign = "test string";
let sig = new KJUR.crypto.Signature({ "alg": "SHA512withRSA" });
sig.init(this._rsaPrivateKey);
sig.updateString(requestStringToSign);
let sigValueHex = this.hexToBase64(sig.sign());

c#

string requestStringToSign = "test string";
using (RSA rsa = _privateCert1.GetRSAPrivateKey())
using (var sha512 = SHA512.Create())
{
     var bytes = Encoding.Unicode.GetBytes(requestStringToSign);
     var hash = sha512.ComputeHash(bytes);
     var signatureBytes = rsa.SignHash(hash, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
     var signature = Convert.ToBase64String(signatureBytes);
}

经过几天的研究和反复错误,我发现了讨论,评论使我得出了答案。这是我对仍在寻找它的任何人的正式答案。

在C#或VB中验证时,您必须考虑各种编码。

Dim symmetricKey = (New Guid(secret)).ToByteArray() 'This array encoding is used by .NET
Dim symmetricKeyUTF8 = (Text.Encoding.UTF8.GetBytes(secret)) 'This is used by Javascript and our Postman example
Dim issuerSigningKeys = New List(Of SecurityKey) From {New SymmetricSecurityKey(symmetricKey), New SymmetricSecurityKey(symmetricKeyUTF8)}

也总是检查秘密是相同的,无论它有多明显。

最新更新