Có thể giải mã băm MD5 không?


260

Có người nói với tôi rằng anh ta đã thấy các hệ thống phần mềm:

  1. lấy mật khẩu mã hóa MD5 từ các hệ thống khác;
  2. giải mã mật khẩu được mã hóa và
  3. lưu trữ mật khẩu trong cơ sở dữ liệu của hệ thống bằng thuật toán riêng của hệ thống.

Điều đó có thể không? Tôi nghĩ rằng việc giải mã băm MD5 là không thể / khả thi.

Tôi biết có từ điển MD5, nhưng có một thuật toán giải mã thực tế không?


7
Hoàn nguyên MD5 cũng sẽ mang lại nhiều mật khẩu.
Công ty Carles

231
MD5 là một thuật toán tiêu hóa. Hãy nghĩ về nó như chuyển đổi một con bò thành bít tết. Bây giờ hãy cố gắng đảo ngược điều đó.
Ốc cơ khí

5
@Arst từ những gì tôi hiểu, có, nhưng chỉ khi bạn có ALOT của những người đó. Và ngay cả khi bạn đã làm, bạn sẽ không thể đi ngược lại, vì thuật toán cố tình làm mất thông tin.
Jordan

8
@m cơsail đưa ra sự tương tự, người ta có thể tạo một bản sao hoàn hảo hoàn toàn từ DNA trên bít tết. :))
Trimikha Valentius 11/03/2015

8
@TrimikhaValentius MD5 là một thuật toán tiêu hóa. Hãy nghĩ về nó như ăn bít tết> tiêu hóa> đầu ra. Bây giờ hãy cố gắng đảo ngược điều đó.
dùng4157124

Câu trả lời:


424

Số MD5 không phải là mã hóa (mặc dù nó có thể được sử dụng như một phần của một số thuật toán mã hóa), đây là hàm băm một chiều . Phần lớn dữ liệu gốc thực sự bị "mất" như là một phần của quá trình chuyển đổi.

Hãy nghĩ về điều này: Một MD5 luôn dài 128 bit. Điều đó có nghĩa là có 2 128 băm MD5 có thể. Đó là một con số khá lớn, và nó chắc chắn là hữu hạn. Tuy nhiên, có vô số đầu vào có thể có cho hàm băm nhất định (và hầu hết trong số chúng chứa hơn 128 bit, hoặc 16 byte). Vì vậy, thực sự có vô số khả năng cho dữ liệu sẽ băm đến cùng một giá trị. Điều làm cho băm thú vị là rất khó tìm thấy hai phần dữ liệu băm có cùng giá trị và khả năng xảy ra do tai nạn là gần như bằng 0.

Một ví dụ đơn giản cho hàm băm (rất không an toàn) (và điều này minh họa ý tưởng chung về nó là một chiều) sẽ lấy tất cả các bit của một mẩu dữ liệu và coi nó là một số lớn. Tiếp theo, thực hiện phép chia số nguyên bằng cách sử dụng một số lớn (có thể là số nguyên tố) n và lấy phần còn lại (xem: Mô-đun ). Bạn sẽ được để lại một số từ 0 đến n . Nếu bạn thực hiện lại phép tính tương tự (bất kỳ lúc nào, trên bất kỳ máy tính nào, bất cứ nơi nào), sử dụng cùng một chuỗi chính xác, nó sẽ đưa ra cùng một giá trị. Tuy nhiên, không có cách nào để tìm ra giá trị ban đầu là gì, vì có một số lượng vô hạn các số còn lại chính xác, khi chia cho n .

Điều đó nói rằng, MD5 đã được tìm thấy có một số điểm yếu, như với một số toán học phức tạp, có thể tìm thấy một sự va chạm mà không cần thử 2 128 chuỗi đầu vào có thể. Và thực tế là hầu hết các mật khẩu đều ngắn và mọi người thường sử dụng các giá trị chung (như "mật khẩu" hoặc "bí mật") có nghĩa là trong một số trường hợp, bạn có thể đoán chính xác mật khẩu của ai đó bằng cách Googling cho hàm băm hoặc sử dụng Rainbow bàn . Đó là một lý do tại sao bạn phải luôn " muối " mật khẩu băm, để hai giá trị giống nhau, khi được băm, sẽ không băm đến cùng một giá trị.

Khi một phần dữ liệu đã được chạy qua hàm băm, sẽ không quay trở lại.


22
tuy nhiên, có nhiều va chạm hơn so với suy nghĩ ban đầu trong không gian băm MD5. Nó không còn được coi là tối ưu như là hàm băm tốt nhất cho mật khẩu.
Cheeso

12
Vì hầu hết các mật khẩu đều ngắn hơn hàm băm MD5, nên thường chỉ có một mật khẩu cho mỗi hàm băm. (Và việc tìm kiếm một tài khoản, ngay cả khi nó không phải là tài khoản gốc, cũng đủ để truy cập vào tài khoản.) Điểm của chức năng một chiều là không có nhiều dự đoán khác nhau, vì vậy chúng tôi không thể biết cái nào là bản gốc , nhưng thực sự rất khó để tìm thấy ngay cả một giá trị ban đầu .
Paŭlo Ebermann

2
@Nick: Trên thực tế, RFC1321 nói rõ ràng: "Thuật toán lấy thông điệp đầu vào có độ dài tùy ý"
Adam Batkin

6
@Oledit - Tôi không chắc là tôi đồng ý. Với một hàm băm, thường không thể xác định (với độ chắc chắn 100%) đầu vào ban đầu. Có (thường) một số lượng đầu vào vô hạn tạo ra mọi đầu ra có thể (băm). Tôi đã nói chung bởi vì, nếu bạn biết (ví dụ) rằng bạn đang tìm kiếm một chuỗi các ký tự ASCII, và nó ít hơn, giả sử, 12 byte, có thể chỉ có một đầu vào tạo ra một đầu ra nhất định. Nhưng luôn luôn có những va chạm (vô hạn), và trừ khi bạn có một số ràng buộc bên ngoài (như trong ví dụ của tôi), bạn sẽ không bao giờ biết điều gì đúng
Adam Batkin

2
@Adam Batkin, bạn nói đúng, nhưng tôi không có nghĩa là chắc chắn 100%. Phá vỡ mật mã không thể được thực hiện với sự chắc chắn 100%. Người gửi có thể có nghĩa là vô nghĩa ngẫu nhiên thay vì văn bản tiếng Anh sử dụng cùng một khóa giải mã các bản rõ tiếng Anh khác, nhưng xác suất của tiếng Anh rất gần với 100%. Tương tự, khi chọn giữa mật khẩu bài thơ dài UTF-8 của Nhật Bản và các chuỗi vô nghĩa, xác suất của bài thơ là gần 100%. Điều này có thể được thực hiện bằng cách sử dụng xác suất sau thực tế thay vì các ràng buộc prechosen. Nó rõ ràng không thể được thực hiện nói chung, nhưng nó vẫn khá hữu ích.
Oledit

154

Bạn không thể - về lý thuyết. Điểm chung của hàm băm là chỉ có một cách. Điều này có nghĩa là nếu ai đó quản lý để có được danh sách băm, họ vẫn không thể lấy được mật khẩu của bạn. Ngoài ra, điều đó có nghĩa là ngay cả khi ai đó sử dụng cùng một mật khẩu trên nhiều trang web (vâng, tất cả chúng ta đều biết rằng chúng ta không nên, nhưng ...) bất kỳ ai có quyền truy cập vào cơ sở dữ liệu của trang A sẽ không thể sử dụng mật khẩu của người dùng trên trang web B.

Việc MD5 là một hàm băm cũng có nghĩa là nó mất thông tin. Đối với bất kỳ hàm băm MD5 nào, nếu bạn cho phép mật khẩu có độ dài tùy ý, có thể có nhiều mật khẩu tạo ra cùng một hàm băm. Đối với một hàm băm tốt, sẽ không thể tính toán được khi tìm thấy chúng vượt quá độ dài tối đa khá nhỏ, nhưng điều đó có nghĩa là không có gì đảm bảo rằng nếu bạn tìm thấy một mật khẩu có hàm băm đích, thì đó chắc chắn là mật khẩu gốc. Về mặt thiên văn , bạn không thể thấy hai mật khẩu có độ dài hợp lý, chỉ có ASCII có cùng hàm băm MD5, nhưng điều đó là không thể.

MD5 là một hàm băm xấu để sử dụng cho mật khẩu:

  • Thật nhanh chóng, điều đó có nghĩa là nếu bạn có hàm băm "mục tiêu", sẽ rất rẻ để thử nhiều mật khẩu và xem liệu bạn có thể tìm thấy mật khẩu nào cho mục tiêu đó không. Ướp muối không làm giúp với kịch bản, nhưng nó giúp để làm cho nó tốn kém hơn để cố gắng tìm một mật khẩu phù hợp với bất kỳ một trong nhiều băm sử dụng muối khác nhau.
  • Tôi tin rằng nó đã biết những sai sót giúp tìm kiếm sự va chạm dễ dàng hơn, mặc dù việc tìm kiếm sự va chạm trong văn bản có thể in (thay vì dữ liệu nhị phân tùy ý) ít nhất sẽ khó hơn.

Tôi không phải là chuyên gia bảo mật, vì vậy sẽ không đưa ra khuyến nghị cụ thể ngoài "Đừng cuộn hệ thống xác thực của riêng bạn." Tìm một từ một nhà cung cấp có uy tín, và sử dụng đó. Cả thiết kế và triển khai hệ thống bảo mật đều là một công việc khó khăn.


2
Vâng, có nhiều phương pháp khác, nhưng bạn cần hiểu những gì Jon nói ở trên - 'bạn không nên gửi email cho họ mật khẩu của họ - đó là thông tin nhạy cảm có thể vẫn còn nhạy cảm.' - ở mức thấp nhất, email có thể bị chặn và thông tin nhạy cảm có thể được truy xuất. Mật khẩu phải được bảo mật nhất có thể - thường bằng cách giữ mật khẩu dưới dạng băm chỉ trong cơ sở dữ liệu.
Daniel ngày

3
Và cũng có một thực tế là nếu mật khẩu có thể bị đảo ngược, điều đó có nghĩa là bất kỳ ai có quyền truy cập vào cơ sở dữ liệu của bạn đều có thể lấy mật khẩu của người dùng. Không phải là một ý tưởng tốt. Mật khẩu một chiều nên là chuẩn mực; chỉ giữ mật khẩu thực (thậm chí được mã hóa) nếu bạn hoàn toàn phải (ví dụ: để xác thực với một hệ thống khác không có bất kỳ mã thông báo nào).
Jon Skeet

1
Tôi đã thấy các biện pháp chống thư rác trong đó máy chủ web nhận máy chủ từ chối thư đến chỉ để chờ người gửi thư của người gửi thử lại (spam bots thường chỉ thử một lần). Điều đó có thể dễ dàng vượt quá thời gian chờ 10 phút của bạn.
sisve

1
@ravisoni: Đó là việc tìm kiếm một giá trị có cùng hàm băm, có lẽ thông qua lực lượng vũ phu hoặc bảng tra cứu. Không có gì đảm bảo rằng đó là giá trị văn bản gốc.
Jon Skeet

5
@ravisoni: Ý của bạn là "đúng" ở đây là gì? Nếu mật khẩu không xác định, bạn không thể biết liệu mật khẩu được tiết lộ có phải là mật khẩu gốc hay không. Nhưng vấn đề là một cách băm như MD5 theo định nghĩa sẽ mất thông tin. Việc các trang web như thế này có thể đưa ra một mật khẩu phù hợp chỉ là bằng chứng tốt về MD5 là một thuật toán tồi để sử dụng vì lý do bảo mật.
Jon Skeet

52

Về mặt kỹ thuật, điều đó là 'có thể' , nhưng trong những điều kiện rất nghiêm ngặt ( các bảng cầu vồng , buộc phải dựa trên khả năng rất nhỏ là mật khẩu của người dùng nằm trong cơ sở dữ liệu băm đó).

Nhưng điều đó không có nghĩa là nó

  • Khả thi
    hoặc
  • Đảm bảo

Bạn không muốn 'đảo ngược' hàm băm MD5 . Sử dụng các phương pháp được nêu dưới đây, bạn sẽ không bao giờ cần. 'Đảo ngược MD5 thực sự bị coi là độc hại - một số trang web cung cấp khả năng' bẻ khóa 'và băm MD5 - nhưng tất cả chúng đều là cơ sở dữ liệu lớn chứa các từ điển, mật khẩu đã gửi trước đó và các từ khác. Có một cơ hội rất nhỏ rằng nó sẽ có hàm băm MD5 mà bạn cần đảo ngược. Và nếu bạn đã muối băm MD5 - điều này sẽ không làm việc một trong hai! :)


Cách đăng nhập với băm MD5 nên hoạt động là:

Trong khi đăng ký:
Người dùng tạo mật khẩu -> Mật khẩu được băm bằng MD5 -> Hash được lưu trữ trong cơ sở dữ liệu

Trong khi đăng nhập:
Người dùng nhập tên người dùng và mật khẩu -> (Đã chọn tên người dùng) Mật khẩu được băm bằng MD5 -> Hash được so sánh với hàm băm được lưu trữ trong cơ sở dữ liệu

Khi cần 'Mất mật khẩu':

2 tùy chọn:

  • Người dùng đã gửi một mật khẩu ngẫu nhiên để đăng nhập, sau đó bị lỗi để thay đổi mật khẩu trong lần đăng nhập đầu tiên.

hoặc là

  • Người dùng được gửi một liên kết để thay đổi mật khẩu của họ (với kiểm tra thêm nếu bạn có câu hỏi bảo mật / vv) và sau đó mật khẩu mới được băm và thay thế bằng mật khẩu cũ trong cơ sở dữ liệu

1
Tôi đã có một vài nitpicks. Bàn cầu vồng không phải là vũ phu cưỡng bức. Thực tế, có những chương trình và trang web thực hiện mật khẩu vũ phu (rất đơn giản) của một vài ký tự (nói chung chúng chỉ lặp trong vài giờ hoặc vài ngày, và bạn có thể điền vào một hàm băm và hy vọng nó xuất hiện trong vòng lặp). Và thật không may, do thiếu chất lượng của nhiều mật khẩu, cơ hội mà một cái bật lên không phải là "một cơ hội rất nhỏ".
Maarten Bodewes

32

Không trực tiếp. Do nguyên tắc pigeonhole , (có thể) có nhiều hơn một giá trị băm cho bất kỳ đầu ra MD5 nào. Như vậy, bạn không thể đảo ngược nó một cách chắc chắn. Hơn nữa, MD5 được tạo ra để làm cho khó tìm thấy bất kỳ hàm băm đảo ngược nào như vậy (tuy nhiên đã có các cuộc tấn công tạo ra xung đột - nghĩa là tạo ra hai giá trị băm cho cùng một kết quả, nhưng bạn không thể kiểm soát giá trị MD5 kết quả sẽ như thế nào là).

Tuy nhiên, nếu bạn giới hạn không gian tìm kiếm, ví dụ, mật khẩu phổ biến có độ dài dưới N, bạn có thể không còn thuộc tính không thể đảo ngược (vì số lượng đầu ra MD5 lớn hơn nhiều số lượng chuỗi trong miền quan tâm). Sau đó, bạn có thể sử dụng bảng cầu vồng hoặc tương tự như băm ngược.


1
Tôi sẽ thêm rằng việc tìm một giá trị khác băm cho cùng một đầu ra được gọi là "xung đột". Đây là phương pháp phổ biến nhất để phá vỡ các hệ thống băm MD5.
Nicole

5
@Renesis, việc tìm kiếm dữ liệu mà băm một giá trị được biết đến trước đây được gọi là "preimage", trên thực tế, và đó là nhiều, nhiều khó khăn hơn so với chỉ một vụ va chạm. Không có cuộc tấn công tiền chế nào được chứng minh chống lại MD5, nhưng các cuộc tấn công va chạm đã được sử dụng.
bdonlan

Điểm của các hàm băm (khi được sử dụng để lưu trữ mật khẩu) không phải là có rất nhiều mật khẩu có thể cung cấp cùng một hàm băm (có, nhưng hầu hết chúng đều dài hơn chính hàm băm), nhưng rất khó tìm thấy một trong số họ (sẽ đủ để truy cập hệ thống). Và vâng, vì các bảng cầu vồng, bạn không sử dụng băm không ướp muối. Và vì không gian mật khẩu nhỏ, bạn sẽ sử dụng hàm băm chậm (như bcrypt hoặc mã hóa) thay vì mật khẩu nhanh (như MD5 / SHA - * / ....)
Paŭlo Ebermann

1
Về mặt kỹ thuật, bạn không thể thực hiện MD5 một cách chắc chắn, vì phần cứng có thể đã bị hỏng. Theo cùng một cách, bạn có thể không chắc chắn rằng mật khẩu là passwordchứ không phải tất cả các đầu vào vô hạn khác tạo ra cùng một hàm băm nhưng tất cả đều trông khá ngẫu nhiên, nhưng bạn có thể đủ gần.
Oledit

Tất nhiên, nguyên tắc pigeonhole được áp dụng, nhưng vẫn không thể tính toán được khi tìm thấy đầu vào thứ hai băm đến một giá trị nhất định, ví dụ: băm qua mật khẩu bình thường. Nếu bạn tìm thấy một chữ X băm đến một H (X) nhất định thì bạn có thể chắc chắn rằng X là đầu vào chính xác. Điều này làm cho toàn bộ phần đầu tiên của câu trả lời này và hầu hết phần còn lại không chính xác.
Maarten Bodewes

13

Không thể, ít nhất là không trong một khoảng thời gian hợp lý.

Cách thức này thường được xử lý là "đặt lại" mật khẩu. Đó là, bạn cung cấp cho họ mật khẩu (ngẫu nhiên) mới và gửi cho họ trong email.


5
Nếu hàm băm không được muối, bạn sẽ ngạc nhiên về mức độ thường xuyên của nó là một tìm kiếm google cho giá trị băm ...
Michael Borgwardt

1
Tuy nhiên, nó không thực sự thiết thực cho một hệ thống truy xuất mật khẩu, thậm chí là một hệ thống không được đánh dấu :)
Matthew Groves

12

Bạn không thể hoàn nguyên mật khẩu md5. (Bằng bất kỳ ngôn ngữ nào)

Nhưng bạn có thể:

cung cấp cho người dùng một cái mới.

kiểm tra trong một số bảng cầu vồng để có thể lấy lại cái cũ.


1
Nix ý tưởng bảng cầu vồng. Nếu bạn đang muối - và bạn nên - thì dù sao nó cũng không hoạt động.
Steven Sudit

1
@StevenSudit Nếu họ vẫn đang sử dụng MD5 để băm mật khẩu thay vì sử dụng hàm băm mật khẩu mạnh, thì bạn không thể cho rằng họ đang sử dụng muối. Có lẽ họ làm, có lẽ họ không.
Maarten Bodewes

10

Không, anh ta hẳn đã nhầm lẫn về từ điển MD5.

Băm mật mã (MD5, v.v ...) là một cách và bạn không thể quay lại tin nhắn ban đầu chỉ bằng thông báo trừ khi bạn có một số thông tin khác về tin nhắn gốc, v.v. mà bạn không nên.


8

Giải mã (trực tiếp nhận văn bản đơn giản từ giá trị băm, theo cách thuật toán), không.

Tuy nhiên, có những phương pháp sử dụng cái được gọi là bảng cầu vồng . Nó là khá khả thi nếu mật khẩu của bạn được băm mà không có muối.


7

MD5 là một thuật toán băm, bạn không thể hoàn nguyên giá trị băm.

Bạn nên thêm "tính năng thay đổi mật khẩu", trong đó người dùng cung cấp mật khẩu khác, tính toán hàm băm và lưu trữ dưới dạng mật khẩu mới.


7

Không có cách nào dễ dàng để làm điều đó. Đây là loại điểm băm mật khẩu ở nơi đầu tiên. :)

Một điều bạn nên làm là đặt mật khẩu tạm thời cho họ theo cách thủ công và gửi cho họ.

Tôi ngần ngại đề cập đến điều này bởi vì đó là một ý tưởng tồi (và dù sao nó cũng không được đảm bảo để hoạt động), nhưng bạn có thể thử tra cứu hàm băm trong bảng cầu vồng như milw0rm để xem liệu bạn có thể khôi phục mật khẩu cũ theo cách đó không.


6

Xem tất cả các câu trả lời khác ở đây về cách thức và lý do tại sao nó không thể đảo ngược và tại sao bạn không muốn.

Để hoàn thiện, có những bảng cầu vồng mà bạn có thể tra cứu các trận đấu có thể có trên đó. Không có gì đảm bảo rằng câu trả lời trong bảng cầu vồng sẽ là mật khẩu ban đầu được người dùng của bạn chọn để điều đó làm họ bối rối.

Ngoài ra, điều này sẽ không làm việc cho băm muối. Salting được khuyến cáo bởi nhiều chuyên gia bảo mật.


Không chính xác . Nếu một kết quả khớp được tìm thấy thì chắc chắn đó sẽ là mật khẩu gốc. Nếu đây không phải là trường hợp thì có thể tạo ra xung đột với bất kỳ H (X) nào trong đó X là một thông điệp không có cấu trúc được xác định trước được xác định bởi đối thủ. Không thể tính toán được khi tìm thấy sự va chạm như vậy đối với hàm băm bảo mật bằng mật mã, ngay cả khi đó là hàm băm bị hỏng như MD5.
Maarten Bodewes

@MaartenBodewes: "Nếu tìm thấy kết quả trùng khớp thì chắc chắn đó sẽ là mật khẩu gốc." Tôi không thể thấy trường hợp đó như thế nào, nếu chúng ta giả sử độ dài mật khẩu không giới hạn. Tôi muốn nói rằng nó rất có khả năng trở thành mật khẩu ban đầu, nhưng nó không được. Thực tế là có nhiều mật khẩu có thể hơn băm MD5 có nghĩa là phải có hai mật khẩu có cùng một hàm băm. Chỉ vì không thể tính toán được khi tìm thấy những va chạm như vậy không có nghĩa là chúng không tồn tại. Hay tôi đã hiểu lầm bạn?
Jon Skeet

@JonSkeet Nếu không thể tìm thấy sự va chạm về mặt tính toán thì việc tìm kiếm một cách tình cờ cũng khó xảy ra hoặc tệ hơn. Do không gian đầu ra hạn chế của MD5 và sự cố sinh nhật, khả năng bạn sẽ tìm thấy xung đột là khoảng 1 trong 2 ^ 64 (tức là khoảng một nửa không gian đầu ra) - và đó là sau khi khớp khoảng 2 ^ 64 băm. Và điều này thậm chí không cân nhắc rằng thông điệp có thể cần phải nhỏ và có định dạng cụ thể để được coi là mật khẩu. Hầu hết các mật khẩu có một entropy đáng kể dưới 2 ^ 64 bit.
Maarten Bodewes

1
@MaartenBodewes: Nhưng có một sự khác biệt lớn giữa "không thể thiên văn" và "không thể". Tuyên bố của bạn về việc chắc chắn rằng đó là mật khẩu đúng quá mạnh, IMO. Điều đó cho thấy một sự chắc chắn về mặt toán học không có mặt.
Jon Skeet

Bạn cũng có thể đoán khóa AES 2 ^ 128 bit trong một lần. Đó là "chỉ" cực kỳ khó xảy ra. Mật mã học dựa trên các loại tỷ lệ cược này. Đối với tất cả các mục đích thực tế, nếu bạn tìm thấy một thông điệp / mật khẩu đầu vào, nó sẽ là một trong những bạn đang tìm kiếm. Về mặt lý thuyết có thể tìm thấy một thông điệp đầu vào khác là tốt, nhưng đối với câu hỏi này trên StackOverflow thì không cần phải xem xét nó. Và bảng cầu vồng chỉ chứa đầy mật khẩu có thể. Chúng sẽ không chứa đủ dữ liệu để thậm chí có khả năng xảy ra va chạm (chúng sẽ vô tình ghi đè lên bản đồ hoặc trở nên nổi tiếng).
Maarten Bodewes

4

Không có cách nào "hoàn nguyên" một hàm băm về mặt tìm kiếm hàm nghịch đảo cho nó. Như đã đề cập trước đây, đây là toàn bộ điểm có hàm băm. Nó không nên đảo ngược và nó sẽ cho phép tính toán giá trị băm nhanh. Vì vậy, cách duy nhất để tìm một chuỗi đầu vào mang lại giá trị băm nhất định là thử tất cả các kết hợp có thể. Đây được gọi là cuộc tấn công vũ phu vì lý do đó.

Thử tất cả các kết hợp có thể mất rất nhiều thời gian và đây cũng là lý do tại sao các giá trị băm được sử dụng để lưu trữ mật khẩu theo cách tương đối an toàn. Nếu kẻ tấn công có thể truy cập cơ sở dữ liệu của bạn với tất cả mật khẩu người dùng bên trong, bạn sẽ mất trong mọi trường hợp. Nếu bạn có giá trị băm và mật khẩu mạnh (nói một cách lý tưởng), việc lấy mật khẩu ra khỏi giá trị băm cho kẻ tấn công sẽ khó hơn rất nhiều.

Lưu trữ các giá trị băm cũng không có vấn đề về hiệu năng vì tính toán giá trị băm tương đối nhanh. Vì vậy, những gì hầu hết các hệ thống làm là tính toán giá trị băm của mật khẩu mà người dùng đã nhập (nhanh) và sau đó so sánh nó với giá trị băm được lưu trữ trong cơ sở dữ liệu người dùng của họ.


Không có gì sai với câu trả lời này ngoại trừ tốc độ của hàm băm là một vấn đề rất lớn bởi vì hầu hết các mật khẩu không đủ an toàn và cho phép một kẻ thù thực hiện một cuộc tấn công từ điển. Vì lý do đó, các hàm băm mật khẩu chậm được sử dụng thay vì các hàm băm bảo mật bằng mật mã nhanh.
Maarten Bodewes

3

MD5 được coi là bị hỏng, không phải vì bạn có thể lấy lại nội dung ban đầu từ hàm băm, mà vì với công việc, bạn có thể tạo hai thông điệp băm cho cùng một hàm băm.

Bạn không thể hủy băm MD5.


3
Theo thiết kế, tất cả các băm có cùng chiều dài đều bị va chạm. Không thể tránh khỏi khi hạn chế dữ liệu có độ dài thay đổi. MD5 được coi là lỗi thời vì tốc độ va chạm, không phải vì thực tế va chạm.
Jonathan Lonowski

MD5 được coi là bị hỏng vì khả năng đã được chứng minh là xây dựng các đầu vào va chạm.
Ned Batchelder

3

Bạn có thể tìm thấy các công cụ trực tuyến sử dụng từ điển để truy xuất thư gốc.

Trong một số trường hợp, phương pháp từ điển có thể vô dụng:

  • nếu tin nhắn được băm bằng tin nhắn SALT
  • nếu tin nhắn được băm nhiều lần

Ví dụ, đây là một công cụ giải mã trực tuyến MD5 .


Bảng cầu vồng - không phải tấn công từ điển - là vô ích nếu sử dụng muối. Băm nhiều lần - không có muối - vẫn cho phép các bảng cầu vồng, mặc dù việc tìm kiếm một bảng có sẵn trực tuyến chắc chắn là ít khả năng hơn.
Maarten Bodewes

2

Điều duy nhất có thể làm việc là (nếu chúng tôi đề cập rằng mật khẩu chỉ được băm, không thêm bất kỳ loại muối nào để ngăn chặn các cuộc tấn công phát lại, nếu đó là do bạn phải biết muối), hãy lấy một công cụ tấn công từ điển , các tệp của nhiều từ, số, v.v. sau đó tạo hai hàng, một hàng là từ, số (trong từ điển), một hàng khác là hàm băm của từ và so sánh các giá trị băm nếu khớp với bạn ...

đó là cách duy nhất, không đi sâu vào tiền điện tử.


2

Vâng, chính xác những gì bạn yêu cầu là có thể. Không thể 'giải mã' mật khẩu MD5 mà không cần trợ giúp, nhưng có thể mã hóa lại mật khẩu MD5 thành một thuật toán khác, chỉ là không phải tất cả trong một lần.

Những gì bạn làm là sắp xếp để người dùng của bạn có thể đăng nhập vào hệ thống mới của bạn bằng mật khẩu MD5 cũ. Tại thời điểm họ đăng nhập, họ đã cung cấp cho chương trình đăng nhập của bạn một phiên bản mật khẩu chưa được xóa mà bạn chứng minh khớp với hàm băm MD5 mà bạn có. Sau đó, bạn có thể chuyển đổi mật khẩu chưa được xóa này sang thuật toán băm mới của mình.

Rõ ràng, đây là một quá trình mở rộng vì bạn phải đợi người dùng cho bạn biết mật khẩu là gì, nhưng nó hoạt động.

(NB: bảy năm sau, ồ hy vọng ai đó sẽ thấy nó hữu ích)


Cảm ơn vi đa trả lơi. Tuy nhiên tôi sẽ "1 lên" bạn :) Tôi không thể nhớ nếu tôi thực sự làm điều này, nhưng trên lý thuyết nó sẽ hoạt động. Thay vì chờ đợi mỗi người dùng đăng nhập để chúng tôi có thể mã hóa lại mật khẩu của họ, bạn chỉ cần mã hóa phiên bản băm của mật khẩu của họ. Vì vậy, mọi mật khẩu sẽ được băm MD5, và sau đó được mã hóa. Chỉ cần cập nhật kiểm tra mật khẩu để làm tương tự và dữ liệu người dùng phải an toàn mà không cần sự can thiệp của người dùng.
John Bubriski

Thêm một lời cảnh báo cho nhận xét của tôi ở trên. Tôi không phải là một chuyên gia về mã hóa, vì vậy tôi không chắc có bất kỳ ý nghĩa bảo mật nào nữa không. Ví dụ, mã hóa mật khẩu yếu được băm yếu trước khi mã hóa có khả năng ảnh hưởng đến tính bảo mật của mã hóa (có thể sử dụng một loại muối khác nữa không?). Ngoài ra, bạn có thể có các bản sao lưu nổi xung quanh với các mật khẩu băm MD5 đó. Có lẽ tốt hơn để thực hiện vô hiệu hóa đầy đủ tất cả các mật khẩu hiện có khi thực hiện loại nâng cấp này.
John Bubriski

Các nhà mật mã lo lắng về mã hóa kép, nhưng tôi nghĩ họ chỉ tìm thấy những trường hợp tầm thường trong đó có vấn đề. Nhưng tôi không nghĩ nó hữu ích trong trường hợp này vì MD5 vẫn an toàn cho mật khẩu (không quá dài, văn bản). Tuy nhiên, băm kép có thể hữu ích nếu nhà phát triển trước đó quên thêm muối, nếu không, tôi không thể nghĩ đến trường hợp bạn sẽ không phải nói cho mọi người biết mật khẩu nên được xem xét. Hy vọng, bản sao lưu của bạn không bị mất và dù sao cũng được mã hóa.
dùng3710044

1

Không, nó không thể được thực hiện. Bạn có thể sử dụng từ điển hoặc bạn có thể thử băm các giá trị khác nhau cho đến khi bạn nhận được hàm băm mà bạn đang tìm kiếm. Nhưng nó không thể được "giải mã".


tôi thấy trang web này đảo ngược md5 thành văn bản gốc: md5.gromweb.com . Làm thế nào là nó có thể sau đó?
samach

2
@ samach321 - Dễ dàng: họ có DB chuỗi băm. Bất cứ điều gì bạn nhập vào hộp "Chuyển đổi chuỗi thành băm MD5" đều được thêm vào DB. Hãy thử lấy băm MD5 từ một nguồn khác và nhập vào đó. Trừ khi đó là thứ gì đó trong DB của họ, bạn sẽ không nhận được kết quả.
Vilx-

1

MD5 có điểm yếu của nó (xem Wikipedia ), vì vậy có một số dự án cố gắng tính toán trước giá trị băm. Wikipedia cũng gợi ý về một số dự án này. Một cái tôi biết (và tôn trọng) là ophrack. Bạn không thể cho người dùng biết mật khẩu của riêng họ, nhưng bạn có thể cho họ biết mật khẩu hoạt động. Nhưng tôi nghĩ: Chỉ cần gửi thư qua mật khẩu mới trong trường hợp họ quên.


Thực tế là MD5 bị hỏng (đối với việc sử dụng cụ thể nhưng quan trọng của hàm) hoàn toàn không liên quan gì đến các bảng cầu vồng (đó là những gì bạn gợi ý khi đề cập đến tiền mã hóa băm).
Maarten Bodewes

1

Thuật toán Hash MD5 không thể đảo ngược, do đó không thể giải mã MD5, nhưng một số trang web có bộ mật khẩu trùng khớp hàng loạt, vì vậy bạn có thể thử trực tuyến để giải mã băm MD5.

Thử trực tuyến:

Giải mã MD5

md5online

md5decrypter


Vâng, nhưng điều này đã được bao phủ bởi câu hỏi như trong cụm từ "Tôi biết rằng có từ điển". Do đó, chỉ ra từ điển không được coi là một câu trả lời.
Maarten Bodewes

1

Về lý thuyết , không thể giải mã giá trị băm nhưng bạn có một số kỹ thuật bẩn để lấy lại văn bản thuần gốc.

  1. Bruteforcing : Tất cả các thuật toán bảo mật máy tính đều bị bruteforcing . Dựa trên ý tưởng này, GPU ngày nay sử dụng ý tưởng lập trình song song bằng cách sử dụng nó có thể lấy lại văn bản đơn giản bằng cách ồ ạt xác định nó bằng bất kỳ bộ xử lý đồ họa nào. Công cụ hashcat này thực hiện công việc này. Lần trước khi tôi kiểm tra phiên bản cuda của nó, tôi đã có thể đánh bại một ký tự dài 7 chữ trong vòng sáu phút.
  2. Tìm kiếm trên Internet : Chỉ cần sao chép và dán hàm băm trên Google và xem Nếu bạn có thể tìm thấy bản rõ tương ứng ở đó. Đây không phải là một giải pháp khi bạn đang dồn nén một cái gì đó nhưng nó chắc chắn đáng để thử. Một số trang web duy trì hàm băm cho hầu hết các từ trong từ điển.

2
Tấn công từ điển là một cách khác, hoặc so sánh với các cơ sở dữ liệu khác mà bạn biết mật khẩu đầu vào.
Maarten Bodewes

1

Không, không thể đảo ngược hàm băm như MD5: với giá trị băm đầu ra, không thể tìm thấy thông báo đầu vào trừ khi biết đủ thông tin về thông báo đầu vào.

Giải mã không phải là một hàm được định nghĩa cho hàm băm; mã hóa và giải mã là các chức năng của một mật mã như AES trong chế độ CBC; hàm băm không mã hóa cũng không giải mã . Các hàm băm được sử dụng để tiêu hóa một thông điệp đầu vào. Như tên ngụ ý, không có thuật toán đảo ngược có thể theo thiết kế .


MD5 đã được thiết kế dưới dạng hàm băm một chiều , an toàn về mật mã . Giờ đây thật dễ dàng để tạo ra các xung đột cho MD5 - ngay cả khi một phần lớn của thông báo đầu vào được xác định trước. Vì vậy, MD5 chính thức bị phá vỡ và MD5 không nên được coi là một hàm băm bảo mật bằng mật mã nữa. Tuy nhiên, vẫn không thể tìm thấy một thông báo đầu vào dẫn đến giá trị băm: tìm X khi chỉ biết H (X) (và X không có cấu trúc được tính toán trước với ít nhất một khối dữ liệu được tính toán trước 128 byte) . Không có cuộc tấn công tiền ảnh nào được biết đến chống lại MD5.

Nhìn chung, cũng có thể đoán mật khẩu bằng cách sử dụng các cuộc tấn công từ điển vũ phu hoặc (tăng cường), để so sánh các cơ sở dữ liệu hoặc thử và tìm băm mật khẩu trong cái gọi là bảng cầu vồng. Nếu một kết quả khớp được tìm thấy thì chắc chắn tính toán rằng đầu vào đã được tìm thấy. Hàm băm cũng được bảo vệ chống lại các cuộc tấn công va chạm: tìm kiếm X'để H(X') = H(X)đưa H(X). Vì vậy, nếu một Xđược tìm thấy, chắc chắn tính toán rằng đó thực sự là thông điệp đầu vào. Nếu không, bạn sẽ thực hiện một cuộc tấn công va chạm sau khi tất cả. Các bảng cầu vồng có thể được sử dụng để tăng tốc các cuộc tấn công và có các tài nguyên internet chuyên dụng ngoài đó sẽ giúp bạn tìm một mật khẩu được cung cấp một hàm băm cụ thể.

Tất nhiên có thể sử dụng lại giá trị bămH(X) để xác minh mật khẩu đã được tạo trên các hệ thống khác. Điều duy nhất mà hệ thống nhận phải làm là lưu trữ kết quả của hàm xác định Flấy H(X)làm đầu vào. Khi Xđược đưa cho hệ thống sau đó H(X)và do đó Fcó thể được tính toán lại và kết quả có thể được so sánh. Nói cách khác, không bắt buộc phải giải mã giá trị băm để chỉ xác minh rằng mật khẩu là chính xác và bạn vẫn có thể lưu trữ băm dưới dạng giá trị khác.


Thay vì MD5, điều quan trọng là sử dụng hàm băm mật khẩu hoặc PBKDF (chức năng dẫn xuất khóa dựa trên mật khẩu) để thay thế. Hàm như vậy chỉ định cách sử dụng muối cùng với hàm băm. Bằng cách đó, băm giống hệt nhau sẽ không được tạo cho mật khẩu giống hệt nhau (từ người dùng khác hoặc trong các cơ sở dữ liệu khác). Băm mật khẩu vì lý do đó cũng không cho phép sử dụng bảng cầu vồng miễn là muối đủ lớn và ngẫu nhiên đúng cách.

Băm mật khẩu cũng chứa một yếu tố công việc (đôi khi được định cấu hình bằng cách sử dụng số lần lặp ) có thể làm chậm đáng kể các cuộc tấn công cố gắng tìm mật khẩu được cung cấp giá trị băm và muối. Điều này rất quan trọng vì cơ sở dữ liệu có muối và giá trị băm có thể bị đánh cắp. Cuối cùng, hàm băm mật khẩu cũng có thể bị cứng bộ nhớ do đó cần một lượng bộ nhớ đáng kể để tính toán hàm băm. Điều này khiến cho không thể sử dụng phần cứng đặc biệt (GPU, ASIC, FPGA, v.v.) để cho phép kẻ tấn công tăng tốc tìm kiếm. Các đầu vào hoặc tùy chọn cấu hình khác như tiêu hoặc số lượng song song cũng có thể có sẵn cho hàm băm mật khẩu.

Tuy nhiên, nó vẫn sẽ cho phép bất cứ ai xác minh mật khẩu được cung cấp H(X)ngay cả khi H(X)là mật khẩu băm. Băm mật khẩu vẫn còn mang tính xác định, vì vậy nếu bất kỳ ai biết tất cả đầu vào và thuật toán băm thì Xcó thể được sử dụng để tính toán H(X)và - một lần nữa - kết quả có thể được so sánh.

Băm mật khẩu thường được sử dụng là bcrypt , scryptPBKDF2 . Ngoài ra còn có Argon2 dưới nhiều hình thức khác nhau, là người chiến thắng trong cuộc thi băm mật khẩu hợp lý gần đây. Ở đây trên CrackStation là một bài đăng blog tốt về bảo mật mật khẩu ngay.


Có thể làm cho các đối thủ không thể thực hiện phép tính băm xác minh rằng mật khẩu là chính xác. Đối với điều này, một hạt tiêu có thể được sử dụng làm đầu vào cho mật khẩu băm. Ngoài ra, giá trị băm dĩ nhiên có thể được mã hóa bằng mật mã như AES và chế độ hoạt động như CBC hoặc GCM. Tuy nhiên, điều này đòi hỏi phải lưu trữ bí mật / khóa một cách độc lập và với yêu cầu truy cập cao hơn hàm băm mật khẩu.


0

MD5 là hàm băm mật mã (một chiều), vì vậy không có cách trực tiếp để giải mã nó. Toàn bộ mục đích của hàm băm mật mã là bạn không thể hoàn tác nó.

Một điều bạn có thể làm là một chiến lược vũ phu, trong đó bạn đoán những gì đã được băm, sau đó băm nó với cùng chức năng và xem liệu nó có khớp không. Trừ khi dữ liệu băm rất dễ đoán, mặc dù vậy có thể mất nhiều thời gian.


-1

Vẫn chưa thể đưa một hàm băm của mật khẩu vào một thuật toán và lấy lại mật khẩu ở dạng văn bản đơn giản vì băm là một cách. Nhưng những gì mọi người đã làm là tạo ra các giá trị băm và lưu trữ nó trong một bảng lớn để khi bạn nhập một hàm băm cụ thể, nó sẽ kiểm tra bảng để tìm mật khẩu khớp với hàm băm và trả lại mật khẩu đó cho bạn. Một ví dụ về một trang web thực hiện điều đó là http://www.md5online.org/ . Hệ thống lưu trữ mật khẩu hiện đại phản ánh điều này bằng cách sử dụng thuật toán tạo muối sao cho khi bạn nhập cùng một mật khẩu vào hộp mật khẩu trong khi đăng ký, các giá trị băm khác nhau được tạo ra.


-1

Không, bạn không thể giải mã / đảo ngược md5 vì đây là hàm băm một chiều cho đến khi bạn không thể tìm thấy lỗ hổng mở rộng trong MD5. Một cách khác là có một số trang web có một lượng lớn bộ cơ sở dữ liệu mật khẩu, vì vậy bạn có thể thử trực tuyến để giải mã chuỗi băm MD5 hoặc SHA1 của mình. Tôi đã thử một trang web như http://www.mycodemyway.com/encrypt-and-decrypt/md5 và nó hoạt động tốt với tôi nhưng điều này hoàn toàn phụ thuộc vào hàm băm của bạn nếu băm đó được lưu trữ trong cơ sở dữ liệu đó thì bạn có thể có được chuỗi thực tế .


1
Không, MD5 không phải là mã hóa, thậm chí không phải là mã hóa một chiều (điều này không có ý nghĩa ở nơi đầu tiên).
Maarten Bodewes

@MaartenBodewes Đó là lỗi của tôi, đó không phải là chức năng mã hóa, đó là chức năng băm Cảm ơn bạn.
Rafi Ahmad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.