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

时间:2016-02-03 05:22:40

标签: python hash comparison sha512

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

比较2 sha512
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 } !! :\

6 个答案:

答案 0 :(得分:2)

由于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

答案 1 :(得分:1)

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

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

修改

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

答案 2 :(得分:1)

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

答案 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'

可能需要使用hexdigest()。