比较 python 中作为输入传递的 2 个 sha512 哈希

Compare 2 sha512 hash passed as input in python

我有 2 个哈希值需要比较。1 个来自 API,其他我在内部计算
我知道 2 sha512 可以使用

进行比较
input1.digest() == input2.digest()

两个输入都是 sha512 hash.My 这里的问题是,因为我从 API 中得到其中的一个,它是 string 格式和字符串不没有 digest :

*** AttributeError: 'str' object has no attribute 'digest'

我认为这行得通:

if(calculated_hash != input_hash):
    return False
return True

如何在内部为其中一个测试用例生成哈希值:

hash_val = sha512(parameters.encode('utf-8') + salt.encode('utf-8')).hexdigest()

但是由于哈希每次都是新的,所以这是行不通的。

我如何在给定情况下比较这 2 个哈希值?

编辑:

输入中有一个动态时间戳,因此接收到的哈希值存在差异 vc 从接收到的参数生成的哈希值。但是,我仍然得到比较 hexdigest 时值为 False!! :\

我认为这应该有效:

input1 == input2.digest()

因为,摘要会产生字符串。你从 api 得到 input1 那是字符串。

演示:

>>> import hashlib
>>> hash =hashlib.sha512("hello")
>>> type(hash)
<type '_hashlib.HASH'>
>>> type(hash.digest())
<type 'str'>
>>> print hash.digest()
?q?$?b?x]??j??=s1??
                    ?????%g<?##?ٛ??|z?n???
                                         FcG\.\:??os???C
>>> hash.hexdigest()
'9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043'

可能您需要使用 hexdigest()。

我怀疑你想要:

if calculated_hash.digest() != input_hash:
    return False
return True

但是如果没有看到更多代码就很难说。

请使用type检查您的对象。

假设你确定你的对象是散列的,表达式肯定是正确的:

input1.digest() == input2.digest()

如果对象不是 <type '_hashlib.HASH'> 而是字符串,您应该首先散列对象,然后比较对象。

input1 = hashlib.sha512(input1)
input1.digest() == input2.digest()

由于input1来自API并且是str,因此需要将其输入到实际的哈希函数中。查看文档 (https://docs.python.org/3/library/hashlib.html) 我们可以看到类似

的内容
...
h1 = hashlib.sha512(bytes(input1))
return h1.digest() == input2.digest()

我们需要将 input1str 转换为 bytes,因为散列函数需要一个类似字节的输入。但是,根据您的 Python 版本(2.X 而不是 3.X),不需要进行此转换,因为字符串默认为 bytes

input1input2 的确切值添加到问题中。

哈希输出可能不同的唯一方式是输入字符串不同,在我看来你有一个参数,其值在运行时每次都被错误地更改。如果我处在你的位置,我会检查每次将一些时间戳或请求随机数等输入到 SHA 计算中,这对于每个请求都是不同的。

编辑:

正如 OP 所提到的,这是输入字符串中存在动态时间戳的问题。至于使用 bytes 函数,字符串并不是真正需要它,直接比较 sha512(input).hexdigest 应该可以。

python中的

secrets模块提供了一个函数,'compare_digest',也可以用来比较两个'sha'族哈希函数的摘要和十六进制摘要。这是一个例子。

import hashlib, secrets

data_1 = b'Hello'
sha256_1 = hashlib.sha256(data_1).digest()

data_2 = b'Hello'
sha256_2 = hashlib.sha256(data_2).digest()

data_3 = b'However'
sha256_3 = hashlib.sha256(data_3).digest()

print(secrets.compare_digest(data_1, data_2)) #True
print(secrets.compare_digest(data_1, data_3)) #False