在Python

时间:2017-08-15 23:42:12

标签: c# python

我想要在Python中使用一个小的C#函数。但是我不知道如何使用hashlib来完成相同的结果。函数接收一个字符串,返回字符串sha1哈希的base64编码:

private string ConvertStringToHash(string word)
{
  return Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(new UnicodeEncoding().GetBytes(word)));
}

我在python上尝试了这个但是我没有得到相同的结果:

def convert_string_to_hash(word):
    m1 = hashlib.sha1()
    m1.update(word)
    res = m1.digest()
    encoded = base64.b64encode(res)
    return encoded

在Python中完成同样的事情最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

输出的差异源于您使用的编码:

  • 在您的C#代码中,UnicodeEncoding将输入字符串(word)编码为UTF-16 little endian;和
  • 在您的Python代码中,您甚至不处理Unicode字符串(它们必须编码为某些字节)

因此,只需在散列之前将word编码为UTF-16 little endian

import hashlib
import base64

def convert_string_to_hash(word):
    digest = hashlib.sha1(word.encode('utf-16-le')).digest()
    return base64.b64encode(digest)

此外,您的Python功能可以稍微缩短。

答案 1 :(得分:0)

以下内容适用于我在 LDAP 中存储。十六进制匹配,但正是 base64 编码使它越界 - python3。

    newSaUserPassword = "{SHA256}" + \
                        base64.b64encode(hashlib.sha256(options.newSaUserPassword.encode("utf-8")).digest())