【问题标题】:Convert string to base 64 from sha1 Hash in Python在 Python 中将字符串从 sha1 Hash 转换为 base 64
【发布时间】:2021-07-26 21:35:20
【问题描述】:

我有一个小 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 中完成同样事情的最佳方法是什么?

【问题讨论】:

  • 您能发布一些示例输入词和您的预期输出吗?

标签: c# python


【解决方案1】:

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

  • 在您的 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 函数可以稍微缩短。

【讨论】:

  • 非常感谢!输出现在完美匹配:)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 2015-08-09
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多