问题描述
我有一个使用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);
}
}
FwdJUHxt/xSeNxHQFiOhmPDRh73NFfuWK7LG6ssN9k4=
高度