В последнее время я имел дело с 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 с помощью ключевого слова «лимон». Затем я взял зашифрованную строку 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;
И, как вы можете видеть, он подключается правильно:
И если мы снова посмотрим на шестнадцатеричный код, то увидим, что здесь ключевая фраза и зашифрованный пароль, но, по крайней мере, не простой текстовый пароль:
Заключение: Тем не менее, «хакер» может видеть ключевую фразу и зашифрованный проход, но будет труднее угадать, как расшифровать проход с помощью ключа, потому что ему придется перепроектировать код и посмотреть, какое шифрование я использовал.По сути, я могу изобрести собственное шифрование и дешифрование, поэтому в нем нет необходимости в OTP, но если кто-то более продвинутый, он все равно сможет увидеть, как я расшифровываю зашифрованный пароль и получаю доступ к моему FTP, применяя его к зашифрованному проходу с использованием ключа.
ДОПОЛНИТЕЛЬНЫЕ МЫСЛИ: Может быть, обфускация кода Delphi была бы гораздо лучшим выбором?
ВОПРОС: Как лучше защитить свой пароль, если он есть?
ИСТОЧНИКИ: Здесь можно найти исходные коды для FTPTester и генератора OTP: Ссылка на оба