it-swarm-vi.com

Làm thế nào để xác định loại mã hóa / mã hóa đã được sử dụng?

Có cách nào để tìm loại mã hóa/mã hóa nào đang được sử dụng không? Ví dụ: tôi đang thử nghiệm một ứng dụng web lưu mật khẩu trong cơ sở dữ liệu ở định dạng được mã hóa (WeJcFMQ/8+8QJ/w0hHh+0g==). Làm cách nào để xác định băm hoặc mã hóa nào đang được sử dụng?

156
Karthik

Chuỗi ví dụ của bạn (WeJcFMQ/8+8QJ/w0hHh+0g==) là mã hóa Base64 cho chuỗi 16 byte, trông không có ý nghĩa ASCII hoặc UTF-8. If đây là giá trị được lưu trữ cho mật khẩu - xác minh (nghĩa là không thực sự là mật khẩu "được mã hóa", thay vào đó là mật khẩu "băm") thì đây có thể là kết quả của hàm băm được tính trên mật khẩu, một hàm băm cổ điển có đầu ra 128 bit là MD5. Nhưng nó có thể là về bất cứ điều gì.

Cách "bình thường" để biết đó là nhìn vào mã ứng dụng. Mã ứng dụng được tái sinh theo cách hữu hình, mập mạp (các tệp thực thi trên máy chủ, mã nguồn ở đâu đó ...) không phải và không thể được bảo vệ nhiều như một khóa bí mật. Vì vậy, kỹ thuật đảo ngược là "con đường để đi".

Chặn kỹ thuật đảo ngược, bạn có thể thực hiện một vài thí nghiệm để cố gắng đưa ra những phỏng đoán có giáo dục:

  • Nếu cùng một người dùng "thay đổi" mật khẩu của mình nhưng sử dụng lại giống nhau, giá trị được lưu trữ có thay đổi không? Nếu có, thì một phần của giá trị có thể là "muối" ngẫu nhiên hoặc IV (giả sử mã hóa đối xứng).
  • Giả sử rằng giá trị là xác định từ mật khẩu cho một người dùng nhất định, nếu hai người dùng chọn cùng một mật khẩu, liệu nó có dẫn đến cùng một giá trị được lưu trữ không? Nếu không, thì tên người dùng có lẽ là một phần của tính toán. Bạn có thể muốn thử tính MD5 ("tên người dùng: mật khẩu") hoặc các biến thể tương tự khác, để xem bạn có khớp không.
  • Là độ dài mật khẩu có giới hạn? Cụ thể, nếu bạn đặt mật khẩu 40 ký tự và không thể xác thực thành công bằng cách chỉ nhập 39 ký tự đầu tiên, thì điều này có nghĩa là tất cả các ký tự đều quan trọng và điều này ngụ ý rằng đây thực sự là mật khẩu băm, không - mã hóa (giá trị được lưu trữ được sử dụng để xác minh mật khẩu, nhưng mật khẩu không thể được phục hồi từ giá trị được lưu trữ).
140
Thomas Pornin

Chỉnh sửa: Tôi chỉ nhận thấy một tập lệnh rất hay có tên hashID . Cái tên mô tả khá nhiều về nó.

~~~

Nói chung, sử dụng kinh nghiệm để đưa ra những phỏng đoán có giáo dục là cách những điều này được thực hiện.

Dưới đây là danh sách với số lượng đầu ra băm rất lớn để bạn biết cách mỗi người nhìn và tạo chữ ký/patters hoặc chỉ cần xác minh về mặt quang học.

Có hai chính điều đầu tiên bạn chú ý đến:

  • độ dài của hàm băm (mỗi hàm băm có độ dài đầu ra cụ thể)
  • bảng chữ cái được sử dụng (tất cả các chữ cái tiếng Anh? số 0-9 và A-F vậy hex? có ký tự đặc biệt nào nếu có không?)

Một số chương trình bẻ khóa mật khẩu (ví dụ John the ripper) áp dụng một số khớp mẫu trên đầu vào để đoán thuật toán được sử dụng, nhưng điều này chỉ hoạt động trên các hàm băm chung. Ví dụ: nếu bạn lấy bất kỳ đầu ra băm nào và xoay từng chữ cái bằng 1, hầu hết các lược đồ khớp mẫu sẽ thất bại.

68
john

Những gì bạn đã đăng là 16 byte (128 bit) dữ liệu được mã hóa cơ sở 64. Thực tế là mã hóa cơ sở 64 không cho chúng ta biết nhiều vì cơ sở 64 không phải là thuật toán mã hóa/băm, đây là một cách để mã hóa dữ liệu nhị phân thành văn bản. Điều này có nghĩa là khối này bao gồm một phần thông tin hữu ích, cụ thể là đầu ra dài 16 byte. Chúng ta có thể so sánh điều này với kích thước khối của các sơ đồ thường được sử dụng và tìm ra nó không thể là gì. Cho đến nay các chương trình phổ biến nhất là:

Điều tiếp theo chúng ta cần làm là xem xét các khối văn bản mật mã khác để tìm ra câu trả lời cho câu hỏi sau:

  • Có phải tất cả các văn bản mật mã có cùng độ dài, thậm chí cho các độ dài đầu vào khác nhau?

Nếu không phải tất cả các khối có cùng độ dài thì bạn không nhìn vào thuật toán băm, mà là một thuật toán mã hóa. Vì đầu ra sẽ luôn là bội số của kích thước khối cơ bản, sự hiện diện của một khối không chia hết cho 16 byte có nghĩa là nó không thể là AES và do đó phải là DES hoặc 3DES.

Nếu bạn có khả năng nhập mật khẩu và quan sát đầu ra, điều này có thể được xác định rất nhanh. Chỉ cần nhập mật khẩu 17 ký tự và nhìn vào độ dài. Nếu 16 byte của nó, bạn có MD5, 20 byte có nghĩa là SHA-1, 24 byte có nghĩa là DES hoặc 3DES, 32 byte có nghĩa là AES.

26
Yaur

Nếu đây thực sự là một hàm băm mật khẩu đơn giản, chúng ta có thể sử dụng Google để bẻ khóa . Tuy nhiên, Base64 rất khó tìm kiếm với tất cả các dấu gạch chéo và dấu cộng, vì vậy trước tiên hãy chuyển đổi hàm băm đó thành thập lục phân:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

OK, bây giờ chúng ta có thể Google cho nó . Hiện tại, tôi đang nhận được chỉ một lần nhấn , từ md5this.com - mặc dù rõ ràng sẽ sớm có nhiều hơn, bao gồm cả bài đăng này.

Thật không may (hoặc may mắn thay, tùy thuộc vào góc nhìn của bạn), chúng tôi không đủ may mắn để thực sự tìm thấy một tiền đề (trang web hiện liệt kê băm này là "bẻ khóa ..."), nhưng thực tế là nó nằm trong danh sách đó đặc biệt khuyến nghị rằng đó thực sự là hàm băm MD5 không được mã hóa của mật khẩu thực.

6
Ilmari Karonen

Nó phụ thuộc vào định dạng - một số giao thức lưu trữ văn bản được mã hóa có phần Cleartext xác định cách mã hóa. Từ ví dụ của bạn, tôi nghi ngờ vì chuỗi bạn tham chiếu quá ngắn đến nỗi có vẻ như đó chỉ là văn bản được mã hóa.

Tôi muốn đề xuất một vài suy nghĩ:

  • "==" ở cuối chắc chắn sẽ là phần đệm, vì vậy đừng bao gồm nó trong bất kỳ nỗ lực giải mã nào.

  • Bạn có thể đang xử lý một hàm băm hoặc băm muối, thay vì mã hóa. Trong trường hợp đó, cố gắng "giải mã" dữ liệu sẽ không hoạt động - bạn cần khớp mật khẩu bằng cách sử dụng cùng giá trị băm và/hoặc muối được sử dụng ban đầu. Không có cách nào với mật khẩu muối để có được giá trị ban đầu.

  • Đặt cược tuyệt đối tốt nhất của bạn là lấy một bản sao của mã được sử dụng để lưu trữ mật khẩu. Ở đâu đó, mật khẩu đang trải qua một hoạt động mật mã. Tìm mã để tìm hiểu những gì đang xảy ra ở đây. 9 trong số 10 lần, họ đang sử dụng một số loại API để băm/tạo muối/mã hóa và bạn có thể bắt chước hoặc đảo ngược nó bằng cùng một API.

6
bethlakshmi

Mã hóa thường có thể được đoán tại. Ví dụ: chuỗi bạn đã đăng trong câu hỏi của bạn được mã hóa Base64. Các dấu bằng là phần đệm trong sơ đồ Base64. Đó là điều mà tôi biết trước mắt từ kinh nghiệm.

Nếu bạn đưa cho tôi một chuỗi đã được mã hóa, tôi có thể cho bạn biết mã hóa nhưng tôi không thể cho bạn biết thuật toán được sử dụng để mã hóa trừ khi có sẵn một số siêu dữ liệu. Lý do là thế này: các thuật toán mã hóa hoạt động bằng cách tạo ra những gì dường như là dữ liệu ngẫu nhiên. Nếu tôi mã hóa hai câu mỗi câu có hai mật mã (bốn đầu ra), bạn sẽ không thể cho tôi biết bất kỳ sự tin cậy nào về mật mã thuộc về mật mã nào trừ khi bạn giải mã nó hoặc phá vỡ mật mã.

Liên quan đến trường hợp cụ thể của bạn, mật khẩu thường được băm. Điều đó có nghĩa là bạn không thể khôi phục mật khẩu từ hàm băm, nhưng bạn có thể kiểm tra xem liệu hàm băm có khớp với mật khẩu không. Về vấn đề đó, câu trả lời của @ john là vàng. Nếu bạn có thể nhập mật khẩu mà bạn biết và sau đó thử các lược đồ phổ biến đối với mật khẩu đó, bạn có thể tìm hiểu hàm băm được sử dụng là gì.

6
Jeff Ferland

Cách duy nhất là đoán. Với kinh nghiệm, công việc đoán sẽ chính xác hơn.

Ví dụ: Dựa trên độ dài đầu ra: đầu ra MD5 là 128 bit hoặc 16 byte, đầu ra SHA1 là 160 bit hoặc 20 byte. Dựa trên bộ ký tự đầu ra: BASE64 tạo đầu ra với các ký tự có thể in được.

Vào cuối ngày, đó là cách tiếp cận thử và dạy cho bạn cách.

4
Nam Nguyen

Đây là an ninh rất yếu trên tất cả các mặt trận! Bản rõ là P4 $$ w0rdP4 $$ w0rd và được mã hóa bằng mã hóa XOR, với khóa CdZ4MLMPgYtAE9gQ80gMtg ==. Điều này tạo ra bản mã được đăng bởi OP ở trên, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Để xác minh:

Đầu tiên, sử dụng xxd để lấy nhị phân cơ bản của bản rõ:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Điều này tạo ra:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Tiếp theo, base64-giải mã khóa và sử dụng xxd để lấy nhị phân cơ bản của khóa:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Điều này tạo ra:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Bây giờ, XOR hai chuỗi nhị phân:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Cuối cùng, sử dụng bc, xxd và base64 để chuyển đổi bản mã nhị phân thành base64:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Điều này tạo ra WeJcFMQ/8 + 8QJ/w0hHh + 0g ==, đó là bản mã được OP đăng trong câu hỏi trên.


Tôi xin lỗi nếu câu trả lời này có vẻ giả tạo. Phải thừa nhận rằng nó là. Các câu hỏi tương tự như thế này, trong đó người đăng chỉ cung cấp một số bản mã và hỏi một số thông tin chi tiết về cách bản mã đó có thể được tạo ra, dường như xuất hiện khá thường xuyên trên security.stackexchange.com; và câu hỏi này thường được tham chiếu như một bản sao cho những câu hỏi đó. Điểm của câu trả lời này là để minh họa rằng các câu hỏi có tính chất này là không thể trả lời được, bởi vì có những giải pháp vô hạn cho các loại câu hỏi này.

1
mti2935

Cách duy nhất là khi có một số siêu dữ liệu cho bạn biết. Ví dụ, gần đây tôi đã làm việc với các tệp PDF và định dạng bao gồm một từ điển chứa bộ lọc, thuật toán, kích thước khóa, v.v. Nhưng nếu tất cả những gì bạn có là bản mã, thì tất cả những gì bạn có là một số mờ đục của dữ liệu.

1
user185