登录javascript vs C#给了我不同的答案

时间:2017-12-21 15:27:36

标签: javascript c# sign

我有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);
}

1 个答案:

答案 0 :(得分:0)

经过数天的研究和反复试验,我找到了这个讨论,评论让我找到了答案。这是我为仍在寻找它的人提供的正式答案。

在 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)}

还要始终检查秘密是否相同,无论它多么明显。