我有2个哈希需要比较.1来自API,其他我已经在内部计算了 我知道可以使用
比较2sha512
input1.digest() == input2.digest()
这两个输入都是sha512
哈希。我的问题是,因为我从API中获取其中一个,它的格式为string
,而字符串没有digest
:
*** AttributeError:'str'对象没有属性'digest'
我认为这样可行:
if(calculated_hash != input_hash):
return False
return True
如何在其中一个测试用例内部生成哈希:
hash_val = sha512(parameters.encode('utf-8') + salt.encode('utf-8')).hexdigest()
但由于哈希每次都是新的,所以这不起作用。
如何在给定场景下比较这两个哈希?
编辑:
输入中有一个动态时间戳,因为从收到的参数生成的哈希接收的vc哈希有差异。但是,我仍然在比较{{1}时得到的值为False } !! :\
答案 0 :(得分:2)
由于input1
来自API并且是str
,因此需要将其输入到实际的哈希函数中。查看文档(https://docs.python.org/3/library/hashlib.html),我们可以看到类似
...
h1 = hashlib.sha512(bytes(input1))
return h1.digest() == input2.digest()
我们需要将input1
从str
转换为bytes
,因为哈希函数需要一个类似字节的输入。但是,根据您的Python版本(2.X而不是3.X),这种转换是不必要的,因为字符串默认为bytes
。
答案 1 :(得分:1)
在问题中添加input1
和input2
的确切值。
哈希输出可能不同的唯一方法是输入字符串是否不同,在我看来你有一个参数,其值在每次运行时都被错误地更改。如果我在你的鞋子里,我会检查一些时间戳,或者每次都要求随机数等进入SHA计算,这对于每个请求都是不同的。
修改强>:
正如OP所提到的,这是输入字符串中存在动态时间戳的问题。至于使用bytes
函数,字符串并不真正需要它,并且比较直接sha512(input).hexdigest
应该有效。
答案 2 :(得分:1)
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
答案 3 :(得分:0)
我怀疑你想要:
if calculated_hash.digest() != input_hash:
return False
return True
但如果没有看到更多的代码,很难说。
答案 4 :(得分:0)
请使用type
检查您的对象。
假设您确定对象是哈希值,表达式肯定是正确的:
input1.digest() == input2.digest()
如果对象不是<type '_hashlib.HASH'>
但它是字符串,则首先应该散列对象,然后比较对象。
input1 = hashlib.sha512(input1)
input1.digest() == input2.digest()
答案 5 :(得分:-1)
我认为这应该有效:
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'