破解一个被操纵的哈希有多容易
Posted
技术标签:
【中文标题】破解一个被操纵的哈希有多容易【英文标题】:How easy is it to crack a manipulated hash 【发布时间】:2018-02-04 18:10:00 【问题描述】:假设我使用了一个函数,例如:
int someHash(string someValue)
return crc32(someValue) + 10 - 5 * 20;
为了重现相同的哈希值,推断哈希是如何被操纵的有多容易?
【问题讨论】:
如果原始字符串大于 4 个字节,crc32 它不能被逆向工程——只能暴力破解——见***.com/questions/1514040/reversing-crc32 我认为问题在于哈希是否涉及对哈希值的自定义操作。 @ramailosathi 是正确的。假设原始字符串/数据是已知的,但不应更改。数据经过哈希处理,哈希值与数据一起保存。 一般来说是不可能的。假设改变是计算low32(sha256(0x76123bed ^ crc32(x)))。你怎么想出来的?如果对所做的更改没有一些限制,这是行不通的。 【参考方案1】:这取决于转换。对于您的 someHash
函数,这非常简单。请注意,您正在应用的转换是一个简单的线性函数。您的转换可以表示为:
其中 h' 是新哈希,h 是原始哈希。如果您有一个散列及其更改后的散列,则可以求解 c 的等式。 (c = h' - h = -90
)。
这个例子是众多例子之一,为什么我们经常说rolling your own crypto 通常不是一个好主意。该方案实际上需要两个属性:
-
该方案必须生成看起来像 random 的输出。
这个方案不容易猜到。
上面提到的攻击是一个原因为什么1.很重要。在这种情况下,转换具有非常清晰的结构,我们可以轻松利用。
2. 是必需的,因为即使我们没有具有这种结构的方案,我们仍然可以枚举c
。在尝试了非常少量的数字之后,我们仍然找到了常量c = -90
。
这并不意味着这是不可能的。恰恰相反:我们使用分组密码来重新加密散列。这是可行的,因为分组密码产生的输出看起来是随机的,并且它需要一个随机生成的≥128 位的密钥(它足够大,不容易被猜到)。
【讨论】:
以上是关于破解一个被操纵的哈希有多容易的主要内容,如果未能解决你的问题,请参考以下文章