我使用md5.new()
; md5.update("aaa")
,md5.digest()
形成数据"aaa"
的md5哈希值。如何使用python返回数据?
答案 0 :(得分:19)
你无法解码md5散列,因为散列是一个最好被认为是one-way encoding的过程(也就是说散列的内容不能被散列;只能通过散列来确定散列的内容检查已知哈希列表,或者通过散列一组输入并将生成的哈希与您尝试“解码”的哈希相匹配)。
引用维基百科,这种哈希算法的主要特征是:
找到一条消息是不可行的 有一个给定的哈希,
是的 在没有的情况下修改消息是不可行的 改变其哈希值,它是不可行的 找到两个不同的消息 相同的哈希。
目前这类算法最常见的用途是:
如果要对数据进行双向加密,则需要查看其他用于Python的加密库(通常,Stackoverflow有recommendation)。
答案 1 :(得分:14)
你做不到。这就是重点 - 哈希是单向的,它与加密不一样。
答案 2 :(得分:3)
如果要中断哈希,例如密码哈希。然后你需要一个非常大的查找表。 John the Ripper通常用于使用字典来破解密码,如果它是一个盐渍密码哈希,这是一个非常好的方法。
另一个approch正在使用Rainbow Table,但这些需要很长时间才能生成。有free rainbow tables accessible online。
Here是一个执行md5()暴力攻击的python脚本。
答案 3 :(得分:2)
我不知道Python - 但哈希函数是不可逆转的。 首先,请注意散列函数提供恒定长度的输出 - 意味着信息将被丢弃(您可以散列3 MB的文件,但仍然只能得到小于1 kB的结果)。 另外,散列函数是因为它们不可逆,所以如果你需要加密,不要使用散列而是加密 - 散列的一个主要应用是当数据库信息泄漏(包含散列)时密码有没有受到损害(有更多的例子,但这是最明显的例子)
答案 4 :(得分:0)
一般来说,BlueRaja和Sean的答案是正确的。 MD5(和其他哈希函数)是单向的,你无法逆转这个过程。
但是,如果您的数据量很小,则可以尝试搜索具有相同哈希值的哈希冲突(另一个或相同的数据)。
答案 5 :(得分:0)
要添加到其他人的观点,MD5是单向哈希。常见用法是散列两个输入值,如果散列值匹配,则输入应相同。从MD5哈希值到哈希输入是没有意义的。你可能追求的是symmetric encryption algorithm - 请参阅two-way keyed encryption/hash algorithm,以便就该主题进行良好的讨论。
答案 6 :(得分:0)
哈希将一堆数据映射到一组有限(尽管很大)的数值/字符串。
这是一个多对一的映射,因此解码哈希不仅在加密意义上是“困难的”,而且在概念上也是不可能的,即使你可以,你会得到一组无限的可能输入字符串
答案 7 :(得分:0)
这是一个“解密”MD5哈希的函数。它不是很快。
import hashlib
import sys
def decryptMD5(testHash):
s = []
while True:
m = hashlib.md5()
for c in s:
m.update(chr(c))
hash = m.hexdigest()
if hash == testHash:
return ''.join([chr(c) for c in s])
wrapped = True
for i in range(0, len(s)):
s[i] = (s[i] + 1) % 256
if s[i] != 0:
wrapped = False
break
if wrapped:
s.append(0)
print decryptMD5(sys.argv[1])
用法:
$ python md5.py 47bce5c74f589f4867dbd57e9ca9f808
aaa