如何在Ruby中解密MD5?

Vol*_*ort 12 ruby md5

可能重复:
是否可以解密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哈希值相关联了.例如,如果你输入70483b6e100c9cebbffcdc62dea07edahttp://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)

  • 那些预加密散列的数据库被称为“彩虹表”。 (2认同)

mat*_*sko 5

MD5 是一种单向哈希加密算法。无法直接解密 MD5 哈希。算法本身使用模块化算法来打包序列化的字符串,并且没有办法倒退。想想看,如果你有 6 % 4 = 2 然后你有 9 % 7 = 2 那么两个结果最终都是 2。这就是 md5 的工作原理。

获得某种形式的未加密 md5 摘要的唯一方法是将其他哈希与其进行比较。md5("me") == hash 也是如此,然后哈希解密 = "me"。这种形式的查找使用彩虹表。您可能会很幸运地在网上寻找“md5 彩虹表查找”。

这是一个示例 md5 查找网站:

http://www.md5decrypter.co.uk/

  • 有趣的是,您通过显示 *collision*... 来解释 MD5 的工作;) (2认同)