比较 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()
我们需要将 input1
从 str
转换为 bytes
,因为散列函数需要一个类似字节的输入。但是,根据您的 Python 版本(2.X 而不是 3.X),不需要进行此转换,因为字符串默认为 bytes
。
将 input1
和 input2
的确切值添加到问题中。
哈希输出可能不同的唯一方式是输入字符串不同,在我看来你有一个参数,其值在运行时每次都被错误地更改。如果我处在你的位置,我会检查每次将一些时间戳或请求随机数等输入到 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
我有 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()
我们需要将 input1
从 str
转换为 bytes
,因为散列函数需要一个类似字节的输入。但是,根据您的 Python 版本(2.X 而不是 3.X),不需要进行此转换,因为字符串默认为 bytes
。
将 input1
和 input2
的确切值添加到问题中。
哈希输出可能不同的唯一方式是输入字符串不同,在我看来你有一个参数,其值在运行时每次都被错误地更改。如果我处在你的位置,我会检查每次将一些时间戳或请求随机数等输入到 SHA 计算中,这对于每个请求都是不同的。
编辑:
正如 OP 所提到的,这是输入字符串中存在动态时间戳的问题。至于使用 bytes
函数,字符串并不是真正需要它,直接比较 sha512(input).hexdigest
应该可以。
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