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:
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:
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:
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:
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:
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
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). –
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
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 ... –