等价于 C# 上的 CryptoJS.enc.Base64.parse

Equivalent of CryptoJS.enc.Base64.parse on C#

我有一个使用 CryptoJS 生成散列的 javascript 后端,我需要在 C# 客户端上生成相同的散列,但无法重现与 javascript.[=14 相同的结果=]

后端代码是这样的:

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="

问题出在将cypherkey转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=

Hth