这有点让我抓狂。我在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.