【问题标题】:How to salt a generated hash from a file in Python如何从 Python 中的文件中生成哈希值
【发布时间】:2022-11-24 11:16:52
【问题描述】:

问题

我写了一个函数来签署上传的文件。为了增加功能的安全性,我想给它添加一个SALT。当我正在读取上传文件的字节时,我想我必须以某种方式添加或附加它?

代码

这是我目前没有 SALT 的(工作)功能:

def sign(file):
    with open(private_key_path, 'rb') as f:
        key = f.read()
    hash = SHA256.new(file.read())
    # do signing stuff
    return signature

之后我尝试更新哈希,但这不起作用:

SALT = "random string";
def sign(file):
    with open(private_key_path, 'rb') as f:
        key = f.read()
    h = SHA256.new(file.read())
    hash = h.update(str.encode(SALT))
    # do signing stuff
    return signature

我该如何解决这个问题?有没有合适的标准方法来做到这一点?

【问题讨论】:

  • 是否有任何错误信息?或者返回的哈希与预期不匹配?你能在你的帖子中添加一些临时文件、salt 和预期结果吗?你可以做简单的SHA256.new(file.read() + SALT.encode())
  • h.update() 就地操作,它不返回新的哈希值。
  • 在此用例中添加盐如何提高安全性?
  • 基本上,由于文档将公开,因此更难伪造相同的文档散列。但在最好的情况下,没有人会得到 SALT。
  • 高度怀疑添加盐会使伪造 SHA256 变得更难...... SHA256 的完整目的是防止这种情况发生,而盐通常用于避免重复的密码哈希,以防两个帐户使用相同的密码。它有一个完全不同的目的。

标签: python encryption sign


【解决方案1】:

试试这个:

SALT = "random string";
def sign(file):
    with open(private_key_path, 'rb') as f:
        key = f.read()
    hash_ = SHA256.new(file.read())
    hash_.update(SALT.encode())
    # do signing stuff
    return signature

根据官方hashlib文档:

hash.update(data) 用类似字节的对象(数据)更新散列对象。

这意味着 SHA256.new() 实际上创建了一个 python 对象,而 .update() 是这个 python 对象的一个​​方法,它更新对象的属性。它不返回任何内容,因此不会将任何内容存储在第二个代码的 hash 变量中。

更多信息请看这个answer

【讨论】:

  • 你的答案很好,但考虑不要在变量命名中使用内置的functions/constants/types的名称(hash()),它可能会导致意外行为。
猜你喜欢
  • 2016-07-16
  • 2023-03-17
  • 2016-12-27
  • 2012-11-19
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多