我正在与API集成。 API的作者向我提供了Postman预请求脚本。该脚本使用了crypto-js - 这是我以前从未使用过的。
在示例中,它们将JSON有效负载进行字符串化,将其解析为UTF8,然后将其解析为base64,使用HmacSHA256对其进行加密,将其解析回UTF8,然后将其解析为base 64
我不确定如何将JS正在做的事情复制到C#等价物。
这是JS代码
var crypto = require("crypto-js");
pm.globals.set("SecretKey", "key");
var key = pm.globals.get("SecretKey");
var payload = {
"vendor": {
"email": "",
"firstName": "",
"lastName": ""
},
"purchaseId": "12345678"
};
var payloadString = JSON.stringify(payload);
var payloadUTF8 = crypto.enc.Utf8.parse(payloadString);
var payloadBase64 = crypto.enc.Base64.stringify(payloadUTF8);
pm.environment.set("Payload", payloadBase64);
var signature = crypto.HmacSHA256(payloadUTF8, key);
var signatureUTF8 = crypto.enc.Utf8.parse(signature);
var signatureBase64 = crypto.enc.Base64.stringify(signatureUTF8);
pm.environment.set("Signature", signatureBase64);
在C#中,这就是我所拥有的:
// payload is JSON object which matches the above.
var payloadString = JsonConvert.SerializeObject(payload);
byte[] bytes = Encoding.Default.GetBytes(payloadString);
var payloadUTF8 = Encoding.UTF8.GetString(bytes);
我不确定System.Security.Crypto命名空间中的相应类。
答案 0 :(得分:1)
这非常接近......我不确定你在哈希之后做的第二个UTF8编码,因为在C#中,哈希已经在一个字节[]中。
static void Main(string[] args)
{
var secretKey = "secret";
var payload = new
{
vendor = new
{
email = "",
firstName = "",
lastName = ""
},
purchaseId = "12345678"
};
string payLoadString = JsonConvert.SerializeObject(payload);
//NOTE: C# uses UTF-8 by default, so this is the same as Encoding.Default.GetBytes();
byte[] payLoadUTF8 = Encoding.UTF8.GetBytes(payLoadString);
string payLoadBase64 = Convert.ToBase64String(payLoadUTF8);
string signatureBase64 = null;
using (HMACSHA256 hmac = new HMACSHA256(Encoding.Default.GetBytes(secretKey)))
{
byte[] hash = hmac.ComputeHash(payLoadUTF8);
signatureBase64 = Convert.ToBase64String(hash);
}
Console.WriteLine($"payLoadBase64:\t{payLoadBase64}");
Console.WriteLine($"signatureBase64: \t{signatureBase64}");
Console.ReadLine();
}