В последнее время я имею дело с FTP и не уверен насчет безопасности компонента Indy TIdFTP
. Вот почему я создал несколько тестов, которыми хочу поделиться с вами, чтобы вы могли высказать свое мнение о передовых практиках и о том, как это делается.
Прежде всего, я просто добавил имя пользователя и пароль в компонент, используя инспектор объектов:
И создал простое соединение, которое хорошо работает:
procedure TForm1.FormActivate(Sender: TObject);
begin
try
FTP.Connect();
ShowMessage ('Connection success');
except
ShowMessage ('Connection failure');
end;
end;
Проблема с этим методом в том, что если вы используете простой инструмент, такой как Resource Hacker, вы можете сразу увидеть все эти данные:
Host = 'ivstefano.com'
Password = 'testpass'
Username = 'testuser'
Тогда я решил быть немного умнее, удалив его из OI и вставив в код, как и все остальные:
FTP.Host:= 'ivstefano.com';
FTP.Username:= 'testuser';
FTP.Password:= 'testpass';
Тем не менее, если кто-то умнее, он может с легкостью использовать такой инструмент, как Hex-редактор, и посмотреть, что в скомпилированном файле в exe:
Итак, я наконец-то сделал инструмент шифрования с использованием OTP ( One Time Pad Wiki ), который вы можете загрузить здесь Пример инструмента OTP :
Я использовал его для шифрования пароля «testpass» с ключевым словом «lemon». Затем я взял зашифрованную строку OTP (#25+#2+#3+#7+#117+#19+#31+#6
) и ключ (#108+#101+#109+#111+#110
) в виде суммы символов ASCII и использовал их в своей основной программе подключения ftp для их расшифровки с использованием OTP снова:
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;
И, как вы видите, он подключается правильно:
И если мы снова посмотрим на Hex, то увидим, что здесь есть ключевая фраза и зашифрованный пароль, но, по крайней мере, пароль в виде простого текста:
Заключение. Тем не менее, «хакер» может видеть ключевую фразу и зашифрованный проход, но будет сложнее угадать, как расшифровать проход, используя ключ, потому что он должен выполнить обратный инжиниринг кода и посмотреть, какой тип шифрования Я использовал. По сути, я могу изобрести свое собственное шифрование и дешифрование, поэтому нет необходимости в OTP, но если кто-то более продвинут, он все равно может увидеть, как я расшифрую зашифрованный пароль и получаю доступ к своему FTP, применяя его к зашифрованному проходу с помощью ключа.
ДОПОЛНИТЕЛЬНЫЕ МЫСЛИ: Может быть, было бы намного лучше сделать запутывание кода Delphi?
ВОПРОС: Как лучше защитить свой пароль, если таковой имеется?
ИСТОЧНИКИ: Здесь можно найти исходные коды для генератора FTPTester и OTP: Ссылка на оба