我们有一个python Web服务.它需要一个哈希作为参数.python中的哈希以这种方式生成.
hashed_data = hmac.new("ant", "bat", hashlib.sha1)
print hashed_data.hexdigest()
Run Code Online (Sandbox Code Playgroud)
现在,这就是我从C#生成哈希的方法.
ASCIIEncoding encoder = new ASCIIEncoding();
Byte[] code = encoder.GetBytes("ant");
HMACSHA1 hmSha1 = new HMACSHA1(code);
Byte[] hashMe = encoder.GetBytes("bat");
Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
Console.WriteLine(Convert.ToBase64String(hmBytes));
Run Code Online (Sandbox Code Playgroud)
但是,我出来的结果不同了.
我应该改变散列的顺序吗?
谢谢,
乔恩
Dar*_*rov 15
为了打印结果:
.hexdigest()Convert.ToBase64String这两个功能根本不做同样的事情.Python的hexdigest只是将字节数组转换为十六进制字符串,而C#方法使用Base64编码转换字节数组.因此,要获得相同的输出,只需定义一个函数:
public static string ToHexString(byte[] array)
{
StringBuilder hex = new StringBuilder(array.Length * 2);
foreach (byte b in array)
{
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString();
}
Run Code Online (Sandbox Code Playgroud)
然后:
ASCIIEncoding encoder = new ASCIIEncoding();
Byte[] code = encoder.GetBytes("ant");
HMACSHA1 hmSha1 = new HMACSHA1(code);
Byte[] hashMe = encoder.GetBytes("bat");
Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
Console.WriteLine(ToHexString(hmBytes));
Run Code Online (Sandbox Code Playgroud)
现在,您将获得与Python相同的输出:
739ebc1e3600d5be6e9fa875bd0a572d6aee9266
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2928 次 |
| 最近记录: |