Bạn không thể 'giải mã' nó, vì nó không bao giờ được mã hóa. Thuật toán băm cửa có thể ánh xạ nhiều chuỗi riêng biệt đến cùng một khóa ('va chạm'). MD5 là một thuật toán.
Xem xét một thuật toán băm đơn giản hơn nhiều:
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
thuật toán này tạo ra một số lượng rất lớn các va chạm băm, không giống như MD5; nhưng vẫn còn, bạn không thể 'giải mã' 6 thành "hello world". Tốt nhất bạn có thể làm là băm chuỗi của riêng bạn cho đến khi bạn tìm thấy một trong đó sản xuất cùng một kết quả (và hy vọng rằng đây là những gì ban đầu được).
… Tuy nhiên, cơ sở dữ liệu lớn tồn tại đã được
mã hóa
được băm số lượng lớn các chuỗi và liên kết chúng với băm MD5 của chúng. Ví dụ: nếu bạn nhập 70483b6e100c9cebbffcdc62dea07eda
vào http://www.md5decrypter.co.uk/, bạn làm lấy lại "Jose".
Nếu bạn muốn làm điều này trong Ruby, bạn sẽ làm gì là một cái gì đó như sau:
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
Bạn có thể không, nó đã không được mã hóa để bắt đầu với, nó đã băm. Hashing là 1 cách. Cách duy nhất để tìm ra giá trị của băm là một bảng cầu vồng. – Phill
Các dấu gạch ngang không thể * bị bẻ khóa * vì chúng không bị * tăng cường *, chỉ * băm *. Nếu không, nó sẽ được gọi là * mã hóa *. – deceze
Xem thêm http://stackoverflow.com/questions/1562064/decrypt-md5-hash và http://stackoverflow.com/questions/1240852/is-it-possible-to-decrypt-md5-hashes – Phrogz