无法在C#中获得与python中相同的哈希值

我有一个字符串,我需要哈希才能访问API. API创建者在Python中提供了一个代码片段,其代码如下:

hashed_string = hashlib.sha1(string_to_hash).hexdigest()

使用此散列字符串访问API时,一切都很好.我试图在C#中获得相同的散列字符串结果,但没有成功.我已经尝试了很多方法但到目前为止还没有任何工作.我知道hexdigest部分以及我在试图模仿行为时记住了这一点.

有谁知道如何在C#中获得相同的结果?

编辑:
这是我尝试在C#中重现相同结果的众多方法之一:

public string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString().ToLower();
    }
}

此代码取自:Hashing with SHA1 Algorithm in C#

其他方式

public string ToHexString(string myString)
{
    HMACSHA1 hmSha1 = new HMACSHA1();
    Byte[] hashMe = new ASCIIEncoding().GetBytes(myString);
    Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
    StringBuilder hex = new StringBuilder(hmBytes.Length * 2);
    foreach (byte b in hmBytes)
    {
        hex.AppendFormat("{0:x2}", b);
    }
    return hex.ToString();
}

此代码取自:Python hmac and C# hmac

编辑2

一些输入/输出:

C#(使用上面提到的第二种方法)

输入:callerId1495610997apiKey3 * _& E#N @ B1)O)-1Y

输出:1ecded2b66e152f0965adb96727d96b8f5db588a

Python

输入:callerId1495610997apiKey3 * _& E#N @ B1)O)-1Y

输出:bf11a12bbac84737a39152048e299fa54710d24e

 

C#(使用上面提到的第一种方法)

输入:callerId1495611935 apiKey {[B {%P)s; WD5& 5x

输出:7e81e0d40ff83faf1173394930443654a2b39cb3

Python

输入:callerId1495611935 apiKey {[B {%P)s; WD5& 5x

输出:512158bbdbc78b1f25f67e963fefdc8b6cbcd741

解决方法:

C#:

public static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            sb.Append(b.ToString("x2")); // x2 is lowercase
        }

        return sb.ToString().ToLower();
    }
}

public static void Main()
{
    var x  ="callerId1495611935​apiKey{[B{+%P)s;WD5&5x";
    Console.WriteLine(Hash(x)); // prints 7e81e0d40ff83faf1173394930443654a2b39cb3
}

Python

import hashlib
s = u'callerId1495611935​apiKey{[B{+%P)s;WD5&5x'
enc = s.encode('utf-8') # encode in utf8
hash = hashlib.sha1(enc)
formatted = h.hexdigest()
print(formatted) # prints 7e81e0d40ff83faf1173394930443654a2b39cb3

您的主要问题是您在C#和Python中对同一个字符串使用不同的编码.在两种语言中使用UTF8并使用相同的外壳.输出是一样的.

请注意,在输入字符串中(在callerId1495611935和apiKey {[B {%P)s; WD5& 5x之间)有一个隐藏的\u200b character.这就是为什么用UTF-8编码字符串会产生与使用ASCII编码不同的结果.那个角色必须在你的字符串里吗?

上一篇:无法获得与java和c#(winrt)相同的hmac_sha1结果


下一篇:keytool不是内部或外部命令,也不是可运行的程序