与C#上的CryptoJS.enc.Base64.parse等效

问题描述

我有一个使用CryptoJS生成哈希的javascript后端,我需要在C#Client上生成相同的哈希,但是无法再现与javascript相同的结果。

后端代码是这样的:

function generateHash (str,cypherkey) {
  return CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(str,CryptoJS.enc.Base64.parse(cypherkey)))
}

console.log(generateHash("testString","UTI5dVozSmhkSE1zSUhsdmRTZDJaU0JtYjNWdVpDQnBkQ0VnUVhKbElIbHZkU0J5WldGa2VTQjBieUJxYjJsdUlIVnpQeUJxYjJKelFIZGhiR3hoY0c5d0xtTnZiUT09"))

并打印:“ FwdJUHxt / xSeNxHQFiOhmPDRh73NFfuWK7LG6ssN9k4 =”

然后,当我尝试使用以下代码在C#客户端上执行相同操作时:

    public static string generateHash(string str,string cypherkey)
    {
        var keyenc = new System.Text.ASCIIEncoding();
        byte[] keyBytes = keyenc.GetBytes(cypherkey);
        var key = BitConverter.ToString(keyBytes);

        var encoding = new System.Text.ASCIIEncoding();
        byte[] keyByte = encoding.GetBytes(key);
        byte[] messageBytes = encoding.GetBytes(str);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return Convert.ToBase64String(hashmessage);
        }
    }

打印其他结果:“ SiEjJASvYWfO5y + EiSJAqamMcUyBSTDl5Sy1zXl1J / k =”

问题在于将密码密钥转换为Base64的过程中,可能是错误的。

有人知道如何解决这个问题吗?

问候和非常感谢^^

解决方法

我还没有看到CryptoJs的来源,因此这里有一些假设(来自方法名称,编码等):

public static string generateHash(string str,string cypherkey)
{
    // based on CryptoJS.enc.Base64.parse
    byte[] keyBytes = System.Convert.FromBase64String(cypherkey);

    using (var hmacsha256 = new HMACSHA256(keyBytes))
    {
        byte[] hashmessage = hmacsha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
        return Convert.ToBase64String(hashmessage);
    }
}

Result

FwdJUHxt/xSeNxHQFiOhmPDRh73NFfuWK7LG6ssN9k4=

高度