2011-08-02 7 views
9

可能性の重複:
Is it possible to decrypt md5 hashes?RubyでMD5を解読するには?

私はRubyでこれを行う:私は戻ってそれを解読んか

Digest::MD5.hexdigest("Jose") 

と "70483b6e100c9cebbffcdc62dea07eda" を取得

しかし、 "ホセ"に?

+8

あなたは、それはそれはハッシュされた、そもそも暗号化されていなかったことができません。ハッシングは1つの方法です。ハッシュの値を調べる唯一の方法は、虹のテーブルです。 – Phill

+3

ハッシュは*エンハッシュ*されていないのでデハッシュできません*、ちょうど*ハッシュ*。それ以外の場合は、*暗号化*と呼ばれます。 – deceze

+0

http://stackoverflow.com/questions/1562064/decrypt-md5-hashおよびhttp://stackoverflow.com/questions/1240852/is-it-possible-to-decrypt-md5-hashes – Phrogz

答えて

38

MD5はハッシュアルゴリズムであるため、出力を元のものに簡単に復号化することはできません(これがハッシュアルゴリズムを使用する理由です)。

よくある例はパスワードです。データベースにパスワードを格納する代わりに、元のパスワードのMD5ハッシュを生成して格納します。ある日誰かがあなたのデータベースを盗むのであれば、実際のパスワードを直接解読することはできないので、実際のパスワードを知ることは難しいです。

しかし、ユーザーにログインしようとすると、実際のパスワードを入力すると、MD5アルゴリズムを再度実行し、保存したものとハッシュを比較します。ユーザーが正しいパスワードを入力した可能性があります。

3

MD5は片方向ハッシュ暗号化アルゴリズムです。 MD5ハッシュを直接解読する方法はありません。アルゴリズム自体はモジュラ演算を使用してシリアル化された文字列をパッケージ化しており、それから逆に進む方法はありません。あなたが6%4 = 2で9%7 = 2の場合、両方の結果は2となります。これはmd5が動作する方法です。

md5ダイジェストの暗号を解除するには、他のハッシュを比較するしかありません。それでmd5( "私")==ハッシュ、ハッシュ復号化= "私"。この形式の検索では、虹のテーブルが使用されます。あなたは、 "md5 rainbow table lookup"をオンラインで見ている運があるかもしれません。ここで

は、例えば、MD5の検索サイトです:

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

+2

興味深いことに*コリジョン* ...;)を表示してMD5の動作を説明してください – deceze

15

それは暗号化されなかったとして、あなたは、それを '解読' することはできません。トラップドアハッシュアルゴリズムは、複数の異なる文字列を同じキーにマッピングすることができます(「衝突」)。 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ハッシュでそれらを関連付けられています。たとえば、70483b6e100c9cebbffcdc62dea07edahttp://www.md5decrypter.co.uk/に入力すると、となり、「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 
+1

あらかじめ暗号化されたハッシュのデータベースは、好奇心をそそるために「レインボーテーブル」と呼ばれています。 –

関連する問題