我有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);
}
答案 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)}
还要始终检查秘密是否相同,无论它多么明显。