可能重复:
是否可以解密md5哈希?
我在Ruby中这样做:
Digest::MD5.hexdigest("Jose")
Run Code Online (Sandbox Code Playgroud)
并得到"70483b6e100c9cebbffcdc62dea07eda"
但是,我如何将其解密回"何塞"?
Mau*_*res 41
MD5是一种散列算法,你不能轻易地将输出解密回原始(这正是我们使用散列算法的原因).
一个常见的例子是密码.您不是在数据库中存储密码,而是生成原始密码的MD5哈希并存储它.如果有一天有人偷了你的数据库,他们就很难找出真正的密码,因为它们无法直接解密.
但是,当您尝试登录用户时,他将输入真实密码,然后您将再次运行MD5算法并将哈希值与您存储的哈希值进行比较,如果它们相同则用户可能会键入正确的密码.
Phr*_*ogz 16
你不能'解密'它,因为它从未加密过.Trapdoor散列算法可以将多个不同的字符串映射到同一个键("碰撞").MD5就是这样一种算法.
考虑一个更简单的散列算法:
def dumb_hash( str )
str.each_byte.inject(0) do |hash,c|
( hash + c ) % 10
end
end
p dumb_hash( "hello world" ) #=> 6
p dumb_hash( "hi there kids" ) #=> 6
Run Code Online (Sandbox Code Playgroud)
与MD5不同,该算法产生大量的哈希冲突; 但仍然,你不能'解码'6到"你好世界".你能做的最好就是散列你自己的字符串,直到你找到一个产生相同结果的字符串(并希望这是原始字符串).
......但是,尽管如此,大型数据库存在那些已经加密 散列字符串的大量并与他们的MD5哈希值相关联了.例如,如果你输入70483b6e100c9cebbffcdc62dea07eda到http://www.md5decrypter.co.uk/,你就得到"何塞"回来.
如果你想在Ruby中这样做,你会做的事情如下:
require 'digest'
require 'sequel' # http://sequel.rubyforge.org/
DB = Sequel.sqlite 'md5s.db'
DB.create_table? :hashes do
String :original
String :hash
end
# Fill the DB with whatever is on each line of the file
IO.foreach( 'my_gigabytes_of_words.txt' ) do |line|
line.chomp!
DB[:hashes] << { original:line, hash:Digest::MD5.hexdigest(line) }
end
# Read from the DB
def find_originals( hash )
DB[:hashes].filter( hash:hash ).map(:original)
end
p find_originals("70483b6e100c9cebbffcdc62dea07eda")
#=> ["Jose"]
#=> ...if that was in your gigabytes of source words
Run Code Online (Sandbox Code Playgroud)
MD5 是一种单向哈希加密算法。无法直接解密 MD5 哈希。算法本身使用模块化算法来打包序列化的字符串,并且没有办法倒退。想想看,如果你有 6 % 4 = 2 然后你有 9 % 7 = 2 那么两个结果最终都是 2。这就是 md5 的工作原理。
获得某种形式的未加密 md5 摘要的唯一方法是将其他哈希与其进行比较。md5("me") == hash 也是如此,然后哈希解密 = "me"。这种形式的查找使用彩虹表。您可能会很幸运地在网上寻找“md5 彩虹表查找”。
这是一个示例 md5 查找网站:
http://www.md5decrypter.co.uk/