为什么在使用python和C#运行相同的密钥和消息时,我会得到不同的哈希



这有点让我抓狂。我在C#中有这段代码,我正试图将其翻译成python,但由于某种原因,我无法获得相同的哈希。

using System.Text;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
// input, plain text here
string key = "8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615";
string tokenHash = "st=1585258906~exp=1585261006~acl=*";
string encoded;
HMACSHA256 hmac = new HMACSHA256(ParseHexBinary(key));
byte[] bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(tokenHash.ToString()));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
sb.Append(bytes[i].ToString("x2"));
}
encoded = sb.ToString();
Console.WriteLine(encoded);
}
private static int HexToBinFn(char c)
{
if ('0' <= c && c <= '9')
{
return c - '0';
}
char c2 = 'A';
if ('A' > c || c > 'F')
{
c2 = 'a';
if ('a' > c || c > 'f')
{
return -1;
}
}
return (c - c2) + 10;
}
public static byte[] ParseHexBinary(String str)
{
int length = str.Length;
byte[] bytes = new byte[(length / 2)];
for (int i = 0; i < length; i += 2)
{
int bin1 = HexToBinFn(str[i]);
int bin2 = HexToBinFn(str[i + 1]);
int i2 = (bin1 * 16) + bin2;
byte b = (byte)i2;
bytes[i / 2] = b;
}
return bytes;
}
}

使用C#,我得到了这个散列:988b6a86f25529ad8a8c2da42bf95a0ca24ea113fb05fcb6e356096852693dda

这是我的python代码:

import hashlib
import hmac
import base64
key = '8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615'
tokenHash = 'st=1585258906~exp=1585261006~acl=*'
x = hmac.new(key.encode('utf-8'), tokenHash.encode('utf-8'), hashlib.sha256).hexdigest()

使用python,我得到了以下哈希:8cbb2096d5e201454bb6797b4689a524d2d7d1def51c4b66ec6b1e4a99a509cf

有人能告诉我区别在哪里吗?我不知道该怎么翻译。非常感谢。

我不知道python对作为hmac.new方法密钥提供的string做了什么,但它似乎没有将十六进制转换为字节,这就是为什么你会得到不同的哈希。如果我先在python中将十六进制转换为字节,那么它们都会产生相同的散列。

import hashlib
import hmac
import base64
import binascii
key = '8ea79bcec3d54597efe186780a835c075400623a11481d3d17dd92e905dbb615'
keyBytes = binascii.unhexlify(key)
tokenHash = 'st=1585258906~exp=1585261006~acl=*'
x = hmac.new(keyBytes, tokenHash.encode('utf-8'), hashlib.sha256).hexdigest()

因此,他们似乎不会产生相同的散列,因为密钥不同。

如果你不能修改python代码,那么在C#中,不要将key视为十六进制字符串并将其转换为byte[],你只需要得到字符串的UTF8字节,它们就会产生相同的哈希。至少对我来说。

//var keyBytes = ParseHexBinary(key); Instead of this...
var keyBytes = Encoding.UTF8.GetBytes(key); //Do this.

相关内容

最新更新