如何加密模仿JavaScript CryptoJS的{C#中的值

时间:2018-05-22 22:21:35

标签: javascript c# cryptojs

我正在与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命名空间中的相应类。

1 个答案:

答案 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();
        }

enter image description here