今天我发现自己试图创建一个这样的 JSON 文档:
{
'a' : 1,
'b' : 2,
'hash' : (some hash value),
}
其中的值hash
是 JSON 文档本身的哈希值。显然,这并不容易,因为散列函数的值会改变文档的散列值。我很确定有更好的方法来做我想做的事情,但只是为了笑,我真的很好奇是否有任何方法可以做到这一点。
那么有什么方法可以将散列设置为 SHA1/MD5(或任何常见的散列/指纹函数),使其等于结果文档的散列?
今天我发现自己试图创建一个这样的 JSON 文档:
{
'a' : 1,
'b' : 2,
'hash' : (some hash value),
}
其中的值hash
是 JSON 文档本身的哈希值。显然,这并不容易,因为散列函数的值会改变文档的散列值。我很确定有更好的方法来做我想做的事情,但只是为了笑,我真的很好奇是否有任何方法可以做到这一点。
那么有什么方法可以将散列设置为 SHA1/MD5(或任何常见的散列/指纹函数),使其等于结果文档的散列?
还有等效 JSON 文档的问题。在大多数情况下,例如文档:
{'a':1,'b':2}
和
{'b':2,'a':1}
是等价的,但它们的字符串可能会产生不同的哈希值。这表明需要在应用散列函数之前将等效文档规范化为相同的形式。
另一个问题出现在使用值“散列”(或包含散列的键)来表示其他含义的 JSON 文档中,例如:
{'a':1,'hash':'this is not a hash'}
如果不使用不同的名称作为散列键,这样的文档怎么能包含散列呢?确实,这似乎是不可能的。
我使用内置散列构建的任何文档总是将散列本身排除在计算之外。例如,在构建文本文件时,第一行或最后一行是哈希值,文件的其余部分是哈希值,例如:
B23128AB
SomeTextHere
SomeMoreText
其中 Hash("SomeTextHere\r\nSomeMoreText\r\n") = B23128AB
我希望您可能需要为您的 JSON 对象执行相同类型的操作。
这仍然是安全的,因为如果散列值或其他内容被破坏(不管哪一个),那么您的验证例程将失败。
这与找到加密安全哈希函数的原像密切相关,因此,我认为您可能要做的最好的事情是尝试基于暴力破解的攻击(开始猜测哈希 h 并检查 f( xhy) = h 穷尽直到你找到一个适用于你的 x 和 y 的 h 或证明不存在)。