如果它包含该哈希值,是否可以计算字符串的哈希值?

时间:2011-10-07 00:08:23

标签: json hash md5 sha1 fingerprint

今天我发现自己试图像这样创建一个JSON文档:

{
    'a' : 1,
    'b' : 2,
    'hash' : (some hash value),
}

hash的值是JSON文档本身的哈希值。显然,这并不容易,因为哈希函数的值会改变文档的哈希值。我很确定有更好的方法来做我想做的事情,但只是为了笑容,老实说我很好奇是否有办法做到这一点。

那么有什么方法可以将哈希设置为SHA1 / MD5(或者实际上任何常见的哈希/指纹识别函数),使其等于结果文档的哈希值?

3 个答案:

答案 0 :(得分:2)

还存在等效JSON文档的问题。在大多数情况下,例如文件:

{'a':1,'b':2}

{'b':2,'a':1}

是等价的,但它们的字符串可能会产生不同的哈希值。这表明在应用哈希函数之前需要将等效文档规范化为相同的表单。

JSON文档中出现另一个问题,即使用值'hash'(或包含哈希的键)来表示其他内容,例如:

{'a':1,'hash':'this is not a hash'}

这样的文档如何包含散列,而不是使用散列键的不同名称?实际上,似乎不可能。

答案 1 :(得分:1)

我使用内置哈希构建的任何文档总是从计算中排除哈希本身。例如,在构建文本文件时,第一行或最后一行是哈希值,文件的其余部分是哈希值,如:

B23128AB
SomeTextHere
SomeMoreText

其中Hash(“SomeTextHere \ r \ nSomeMoreText \ r \ n”)= B23128AB

我希望你可能需要为你的JSON对象做同样的事情。

这仍然是安全的,因为如果哈希值或其他内容被破坏(无关紧要),那么验证例程将失败。

答案 2 :(得分:1)

这与找到加密安全哈希函数的原像非常密切相关,因此,我认为你可能要做的最好的事情就是尝试基于暴力的攻击(开始猜测哈希值并检查)是否f(xhy)= h穷尽直到你找到一个与你的x和y一起工作或者证明不存在的h。)