【问题标题】:How to mock MD5 hash collision如何模拟 MD5 哈希冲突
【发布时间】:2016-10-26 04:58:54
【问题描述】:

我正在使用私有 Ubuntu 服务器并正在测试私有应用程序

我正在使用 Python hashlib 库来生成 MD5 哈希。

现在我希望 MD5 函数始终返回我的特定数字,尽管输入不同。我怎样才能做到这一点?有配置文件吗?

【问题讨论】:

  • 您的用例是什么?为什么您需要这样做?
  • 这是XY problem。告诉我们你真正想做的事。
  • 我想使用 MD5 测试我的应用程序。它是openstack swift。我有关于 MD5 生日的测试用例。因此我希望 Md5 始终具有相同的输出来检查我的应用程序将如何处理它。
  • @NguyenDiep 如果它在 swift 中,那你为什么在你的帖子中提到 Python 以及为什么它被标记为 python?
  • @techydesigner 因为我也看到了由 python 和 swift 编写的 MD5。如果没有,请忽略它。

标签: python md5 hashlib


【解决方案1】:

免责声明

正如 cmets 中提到的,这很可能是一个可怕的想法,很可能是 X / Y problem


为了清楚起见,当我说可以通过猴子补丁完成时,这就是我所指的:

import hashlib

class DummyMD5():

    def __init__(self, realmd5):
        self.md5 = realmd5
        self.v = None

    def hexdigest(self):
        return "12345abcdef"

    def __call__(self, v):
        self.v = v
        return self

    def __getattr__(self, f):
        if f not in self.__dict__:
            return self.md5(self.v).__getattribute__(f)




_md5 = hashlib.md5
hashlib.md5 = DummyMD5(_md5)

只要在 hashlib 调用在其他地方使用之前导入/执行,它就会用常量值替换 hexdigest 的结果。任何其他方法都会返回真正的 md5(如 digest)。

【讨论】:

  • 如何使用你的 DummyMD5?我的应用程序配置是: from haslib import md5.然后使用 MD5(path) 返回输出。
  • 这仍然是一个糟糕的主意。告诉我们您真正想要完成的工作。
  • @tripleee,我的应用程序使用 MD5 来散列对象的路径。我想测试如果MD5返回相同的哈希,会发生什么。所以我想更改 MD5 函数以返回相同的哈希值。
  • 恭喜,你发明了mocking。不幸的是,这个评论框太小了,无法提供详细的教程。
【解决方案2】:

tl;博士 你不能,除非你编写自己的函数或实现一个猴子补丁。

哈希并非旨在为多个完全不同的 sn-ps 数据返回相同的值(尽管由于哈希的长度不可避免地会出现冲突,like with MD5)。您可以编写自己的函数来检查传递的值,并在需要时让它返回一个唯一值。一个例子:

import hashlib

def my_func(thing):
    hash_for_cheese = 'fea0f1f6fede90bd0a925b4194deac11'
    if thing == "cheese":
        return hash_for_cheese
    elif thing == "football":
        return hash_for_cheese
    else:
        return hashlib.md5(thing).hexdigest()

在这种情况下,如果您将 cheesefootball 传递给函数,则会返回相同的哈希值,否则将返回另一个哈希值。

此外,没有“配置文件”。它只是用 C 程序编写的特定算法。如果你很绝望,你也许可以改变它,但它只能在你的系统上工作。

您还可以实现所谓的猴子补丁。我不熟悉这方面的知识,但您可以通过this SO post 了解更多信息。

正如其他人所指出的,我想不出这类问题的用例,尽管如果你需要这样做,那么你就有答案了。

【讨论】:

  • 不是反对者,但你可以。如果你真的想,你可以猴子补丁。这是一个糟糕的想法,但很有可能。
  • 当我说这是一个坏主意时,我的意思并不是特定于猴子修补方法,而是针对为 md5 哈希返回常量值的一般想法。如果这样的事情有一个有效的用例,我会感到非常惊讶。
  • 这是不正确的:“哈希并非旨在永远返回相同的值”,密码哈希函数旨在使其难以计算相同的哈希
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2015-04-07
  • 2013-01-10
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多