如何在Ruby中解密MD5?

时间:2011-08-02 03:18:28

标签: ruby md5

  

可能重复:
  Is it possible to decrypt md5 hashes?

我在Ruby中这样做:

Digest::MD5.hexdigest("Jose")

并获取“70483b6e100c9cebbffcdc62dea07eda”

但是,我如何将其解密回“何塞”?

3 个答案:

答案 0 :(得分:40)

MD5是一种散列算法,您无法轻易将输出解密回原始版本(这正是我们使用散列算法的原因)。

一个常见的例子是密码。您不是在数据库中存储密码,而是生成原始密码的MD5哈希并存储它。如果有一天有人偷了你的数据库,他们就很难找到真正的密码,因为它们无法直接解密。

但是当您尝试登录用户时,他将输入真实密码,然后您将再次运行MD5算法并将哈希值与您存储的哈希值进行比较,如果它们与用户相同可能输入正确的密码。

答案 1 :(得分: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

与MD5不同,此算法会产生大量的哈希冲突;但仍然,你不能'解码'6到“你好世界”。您可以做的最好的事情是哈希自己的字符串,直到找到产生相同结果的字符串(并希望这是原始字符串)。

...然而,那就是说,存在已经加密 哈希大量字符串并将它们与MD5哈希相关联的大型数据库。例如,如果您在http://www.md5decrypter.co.uk/中输入70483b6e100c9cebbffcdc62dea07eda,那么 会返回“Jose”。

如果你想在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

答案 2 :(得分:4)

MD5是一种单向散列加密算法。无法直接解密MD5哈希。算法本身使用模运算来打包序列化的字符串,没有办法从那里倒退。考虑一下,如果你有6%4 = 2然后你有9%7 = 2那么两个结果最终都是2.这就是md5的工作方式。

获取某种形式的非加密md5摘要的唯一方法是比较其他哈希值。 md5(“我”)= =哈希,然后哈希解密=“我”。这种形式的查找使用彩虹表。你可能有一些运气在网上寻找“md5彩虹表查找”。

以下是md5查找网站的示例:

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