2011-08-02 63 views
9

thể trùng lặp:
Is it possible to decrypt md5 hashes?Làm thế nào để giải mã MD5 trong Ruby?

Tôi làm điều này trong Ruby:

Digest::MD5.hexdigest("Jose") 

và nhận được "70483b6e100c9cebbffcdc62dea07eda"

Nhưng, làm thế nào để giải mã nó trở lại tới "Jose"?

+8

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

+3

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

+0

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

Trả lời

38

MD5 là một thuật toán băm, bạn không thể giải mã đầu ra trở lại bản gốc (và đây chính xác là lý do chúng tôi sử dụng thuật toán băm).

Ví dụ phổ biến là mật khẩu. Thay vì lưu trữ mật khẩu trong cơ sở dữ liệu của bạn, bạn tạo một mã băm MD5 của mật khẩu ban đầu và lưu nó. Nếu một ngày nào đó ai đó đánh cắp cơ sở dữ liệu của bạn thì sẽ khó khăn hơn cho họ để tìm ra mật khẩu thực, vì chúng không thể được giải mã trực tiếp.

Nhưng khi bạn đang cố gắng đăng nhập người dùng, anh ấy sẽ nhập mật khẩu thực, sau đó bạn sẽ chạy lại thuật toán MD5 và so sánh băm với thuật toán bạn đã lưu, nếu chúng giống nhau người dùng có thể đã nhập đúng mật khẩu.

3

MD5 là thuật toán mã hóa băm một chiều. Không có cách nào để giải mã trực tiếp mã băm MD5. Bản thân thuật toán sử dụng số học mô-đun để gói chuỗi tuần tự hóa và không có cách nào để quay ngược lại từ đó. Hãy suy nghĩ về nó, nếu bạn có 6% 4 = 2 và sau đó bạn có 9% 7 = 2 sau đó cả hai kết quả kết thúc như 2. Đây là kinda cách md5 hoạt động.

Cách duy nhất để có được một số hình thức hủy mã hóa thông báo md5 là so sánh các băm khác với nó. Vì vậy, hiện md5 ("tôi") == băm, sau đó băm giải mã = ​​"tôi". Hình thức tra cứu này sử dụng một bảng cầu vồng. Bạn có thể có một số may mắn tìm kiếm trực tuyến cho một "tra cứu bảng cầu vồng md5".

Dưới đây là một ví dụ tra cứu md5 website:

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

+2

Thú vị với bạn giải thích hoạt động của MD5 bằng cách hiển thị một * collision * ...;) – deceze

15

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 
+1

Những cơ sở dữ liệu của băm được mã hóa trước được gọi là "bảng cầu vồng" cho tò mò. –

Các vấn đề liên quan