【问题标题】:How to decrypt MD5 in Ruby? [duplicate]如何在 Ruby 中解密 MD5? [复制]
【发布时间】:2011-10-17 22:12:37
【问题描述】:

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

我在 Ruby 中这样做:

Digest::MD5.hexdigest("Jose")

并得到“70483b6e100c9cebbffcdc62dea07eda”

但是,我如何将它解密回“Jose”?

【问题讨论】:

标签: ruby md5


【解决方案1】:

MD5 是一种散列算法,你不能轻易将输出解密回原来的(这正是我们使用散列算法的原因)。

一个常见的例子是密码。您无需在数据库中存储密码,而是生成原始密码的 MD5 散列并存储它。如果有一天有人窃取了您的数据库,他们将更难找出真正的密码,因为它们无法直接解密。

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

【讨论】:

    【解决方案2】:

    您无法“解密”它,因为它从未被加密。陷门散列算法可以将多个不同的字符串映射到同一个键(“冲突”)。 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 解码为“hello world”。您可以做的最好的事情是对自己的字符串进行哈希处理,直到找到产生相同结果的字符串(并希望这是原始字符串)。

    …不过,尽管如此,存在已经加密 散列大量字符串并将它们与它们的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
    

    【讨论】:

    • 那些预加密哈希的数据库被称为“彩虹表”。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 有趣的是,您通过显示 冲突... 来解释 MD5 的工作原理... ;)
    猜你喜欢
    • 2019-10-10
    • 2011-10-24
    • 2011-07-14
    • 2021-06-06
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多