我在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)}
也总是检查秘密是相同的,无论它有多明显。