【问题标题】:Python and Cryptography: md5Python 和密码学:md5
【发布时间】:2013-06-17 16:58:33
【问题描述】:

我对 python 和密码学非常感兴趣,我想知道在 python 中破解哈希的最简单方法是什么。

我想构建一个可以破解这个哈希的小python脚本:21232f297a57a5a743894a0e4a801fc3 这只是“管理员”。

我需要经过什么过程来猜测这个哈希代表什么?

我已经阅读了有关 md5 的内容,此时我才刚刚开始学习密码学背后的方法,但它们还涉及我目前还不了解的深度计算机科学。

我在这里做了一些研究:http://nsfsecurity.pr.erau.edu/crypto/md5.html

【问题讨论】:

  • 为什么专门用​​python?
  • 如果我不湿,md5只能通过暴力破解或字典破解。基本上下载一个单词字典,对每个单词做 md5(word) 并与你的哈希值进行比较。但不能保证如果匹配,它将是“管理员”。
  • @Golgauth MD5 绝对不是“可逆的”。它是一个哈希,并且哈希是不可逆的。但是,MD5 是“损坏的”,这意味着可以在不到蛮力的时间内生成 碰撞
  • @Golgauth 它们是 MD5 散列,而不是编码。编码意味着解码是可能的。 你有更多关于这个浏览器的信息,可以清楚地显示密码吗?我怀疑它没有按照您描述的确切方式工作。执行您所描述的操作仍然需要大量计算。
  • @user2351394 看看John the Ripper

标签: python encryption cryptography


【解决方案1】:

你可以像这样输出一个十六进制 md5:

>>> from hashlib import md5
>>> md5('admin').hexdigest()
'21232f297a57a5a743894a0e4a801fc3'

如果你有一个单词列表,你可以一个一个地尝试它们,如果它们的 md5 与你想要的匹配,则输出。 (这被称为字典攻击)

>>> words = 'test', 'alex', 'steve', 'admin'
>>> for word in words:
...     if md5(word).hexdigest() == '21232f297a57a5a743894a0e4a801fc3':
...         print word
...         break
... 
admin

如果您真的想破解 MD5,您会在 GPU 上获得更好的结果 - 尝试使用像 OCLHashCat 这样的工具

【讨论】:

  • 他有点反问了。
  • @JonathonReinhart 你们很快就会投反对票。查看我的更新答案
  • @AlexL 或者你提交的速度太快了。 -1 被移除。
【解决方案2】:

http://www.google.com/search?q=md5+lookup

>>> import requests
>>> import lxml.html
>>> 
>>> def reverse_md5(digest):
...     r = requests.get('http://www.md5-lookup.com/index.php?q={}'.format(digest))
...     root = lxml.html.fromstring(r.content)
...     for x in root.cssselect('#LSResult table tr')[4:-3]:
...         return x.find('td').text_content() 
...     # fallback to brute force.
...     # ...
... 
>>> reverse_md5('21232f297a57a5a743894a0e4a801fc3')
'admin'
>>> reverse_md5('21232f297a57a5a743894a0e4a801fc4') # lookup fail
>>>

【讨论】:

  • +1 很高兴链接到 md5-lookup.com 。为什么最后一行代码?对我来说似乎是复制/粘贴错误。
  • @owlstead 可能是为了证明如果 md5-lookup 请求失败没有返回任何内容?
  • @AlexL 不用猜了,我等falsetru的回答(反正从MD-5字符串中去掉一个十六进制数字也没多大意义)
  • @owlstead,AlexL 是对的。我删除了一个数字导致查找失败。
  • @falsetru OK,查找会失败,但是由于这既是非法的十六进制字符串也是非法的MD5值,所以没有太大意义;用不同的数字替换一个或两个十六进制数字更有意义。 MD5 值需要是 16 个字节,不能多也不能少。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2014-08-01
  • 2023-03-14
相关资源
最近更新 更多