我想要在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中完成同样的事情最好的方法是什么?
答案 0 :(得分:3)
输出的差异源于您使用的编码:
UnicodeEncoding
将输入字符串(word
)编码为UTF-16 little endian;和因此,只需在散列之前将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())