2012-02-11 49 views
9

Tôi đã xử lý FTP gần đây và tôi không chắc chắn về tính bảo mật của thành phần Indy TIdFTP. Đó là lý do tại sao tôi đã tạo một số bài kiểm tra mà tôi muốn chia sẻ với bạn để bạn có thể đưa ra ý kiến ​​của mình về các phương pháp hay nhất và cách thực hiện.Delphi 7 TIdFTP Bảo mật FTP (bảo vệ bằng mật khẩu)

Trước hết Tôi chỉ cần thêm tên người dùng và mật khẩu vào các thành phần sử dụng Inspector Object: enter image description here

Và tạo ra một kết nối đơn giản mà hoạt động tốt:

procedure TForm1.FormActivate(Sender: TObject); 
begin 
    try 
    FTP.Connect(); 
    ShowMessage ('Connection success'); 
    except 
    ShowMessage ('Connection failure'); 
    end; 
end; 

Vấn đề với phương pháp này là nếu bạn sử dụng một công cụ đơn giản như Resource Hacker, bạn có thể thấy ngay tất cả dữ liệu đó:

Host = 'ivstefano.com' 
Password = 'testpass' 
Username = 'testuser' 

Sau đó, tôi quyết định trở thành một chút thông minh hơn bằng cách loại bỏ nó từ OI và chèn nó vào các mã như mọi người khác không:

FTP.Host:= 'ivstefano.com'; 
FTP.Username:= 'testuser'; 
FTP.Password:= 'testpass'; 

Tuy nhiên nếu ai đó là thông minh hơn ông có thể sử dụng một cách dễ dàng một số công cụ như trình soạn thảo Hex và xem những gì đang trong biên soạn trong exe: enter image description here

Vì vậy, những gì tôi cuối cùng đã là làm cho một công cụ mã hóa sử dụng OTP (One Time Pad Wiki) mà bạn có thể tải về từ đây Sample OTP tool:

enter image description here

Tôi đã sử dụng nó để mã hóa mật khẩu 'testpass' của tôi với từ khóa 'lemon'. Sau đó, tôi mất chuỗi OTP được mã hóa (#25+#2+#3+#7+#117+#19+#31+#6) và chìa khóa (#108+#101+#109+#111+#110), cả trong ASCII tổng của nhân vật và sử dụng chúng trong chương trình kết nối ftp chính của tôi để giải mã chúng bằng OTP một lần nữa:

function opt(text, key: String): String; 
var i: Integer; 
begin 
    SetLength(Result, length(text)); 
    for i:= 1 to length(text) do 
    Result[i]:= Char(Byte(text[i]) xor (i + Byte(key[i mod length(key)]))); 
end; 

procedure TFTPTester.FormActivate(Sender: TObject); 
var decyptedPass: String; 
begin 
    decyptedPass:= opt(#25+#2+#3+#7+#117+#19+#31+#6, #108+#101+#109+#111+#110); 
    FTP.Host:= 'ivstefano.com'; 
    FTP.Username:= 'testuser'; 
    FTP.Password:= decyptedPass; 
    try 
    FTP.Connect(); 
    ShowMessage ('Connection success with pass: ' + decyptedPass); 
    except 
    ShowMessage ('Connection failure'); 
    end; 
end; 

Và như bạn có thể thấy nó kết nối đúng cách:

enter image description here

và nếu chúng ta nhìn vào Hex một lần nữa chúng ta có thể thấy rằng các keyphrase và mật khẩu được mã hóa đang ở đây nhưng ít nhất không phải là mật khẩu văn bản đơn giản:

enter image description here

Kết luận: Mặc dù vậy, các "hacker" có thể xem các keyphrase và vượt qua được mã hóa nhưng nó sẽ là khó đoán như thế nào để giải mã qua sử dụng phím vì ông có thiết kế đối chiếu mã và xem những gì loại mã hóa tôi đã sử dụng. Về cơ bản, tôi có thể phát minh mã hóa và giải mã của riêng mình nên không cần OTP nhưng nếu ai đó nâng cao hơn thì anh ta vẫn có thể thấy cách tôi giải mã mật khẩu được mã hóa và truy cập FTP của tôi bằng cách áp dụng nó cho mật mã được mã hóa bằng khóa.

THÊM THÔNG TIN THÊM: Có thể làm xáo trộn mã Delphi sẽ là lựa chọn tốt hơn nhiều?

CÂU HỎI: Cách nào tốt hơn để bảo vệ mật khẩu của bạn nếu có?

NGUỒN: Ở đây có thể tìm thấy các mã nguồn cho các máy phát điện FTPTester và OTP: Link to both

+1

Lưu ý rằng những gì bạn đang hiển thị không phải là OTP. OTP (pad một lần) sử dụng khóa có độ dài tương tự như dữ liệu được bảo vệ (và khóa phải là ngẫu nhiên hoàn toàn). –

+0

Bạn nói đúng, nhưng lúc đó khi tôi hỏi câu hỏi, tôi không biết gì hơn :) – ziGi

+0

Không có gì ngăn bạn từ ít nhất là sửa đổi câu hỏi. :) OTP phải là chương trình mã hóa bị hiểu lầm nhiều nhất mọi thời đại, nhưng đơn giản nhất ... –

Trả lời

2

Tôi sẽ sử dụng một số công cụ bảo vệ cho các phần mềm, như asprotect để mã hóa tệp exe của bạn.

Nhưng dù sao như Remy Lebeau cho biết FTP gửi mật khẩu dưới dạng văn bản thuần túy, một lỗ hổng bảo mật lớn ...

5

Nó không thực sự quan trọng như thế nào bạn lưu trữ mật khẩu. Bất kỳ loại dung lượng nào bạn sử dụng sẽ có thể bị tấn công bằng kỹ thuật đảo ngược hoàn toàn. Sớm hay muộn, phiên bản thuần văn bản phải được giải mã trong bộ nhớ trước khi nó được chuyển tới TIdFTP, và có những công cụ (IDA, vv) có thể xem bộ nhớ đó sau khi giải mã xảy ra. Chỉ cần chạy tệp thực thi dưới trình gỡ rối và đặt điểm ngắt trong thiết lập thuộc tính Password hoặc phương thức Connect và xem bộ nhớ khi nhấn.

Để làm cho vấn đề tồi tệ hơn, giao thức FTP truyền mật khẩu bằng văn bản thuần túy, vì vậy ngay cả chỉ một gói dữ liệu đơn giản, chẳng hạn như Wireshark, sẽ có thể nhìn thấy nó mà không hack thực thi, trừ khi bạn sử dụng SSL (mà Indy 9 và trước đó không hỗ trợ cho FTP - nâng cấp lên Indy 10 cho điều đó).

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