在Python中将字符串从sha1哈希转换为base 64。

3

我有一个小的 C# 函数,我想在 Python 中使用。然而,我不确定如何使用 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中实现相同的功能,最好的方法是什么?


你能发布一些输入单词的示例和你期望的输出吗? - randomir
2个回答

5

输出结果的差异源于您使用的编码方式:

  • 在您的C#代码中,UnicodeEncoding 将输入字符串 (word) 编码为UTF-16小端;而
  • 在您的Python代码中,您甚至没有处理Unicode字符串(它们必须被编码为一些字节)

因此,在哈希之前,只需将word编码为UTF-16小端

import hashlib
import base64

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

此外,您的Python函数可以缩短一些。

非常感谢!现在输出完美匹配 :) - Pablo Estrada

0

以下是我在LDAP中存储时使用的方法。十六进制匹配,但正是base64编码使其成功 - 使用python3。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接