Delphi 7 TIDFTP FTP security (защита паролем)
в последнее время я имею дело с 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 editor и посмотреть, что в скомпилированном в exe:
так что я, наконец, сделал, чтобы сделать инструмент шифрования с помощью OTP (один Time Pad Wiki), который вы можете скачать здесь образец OTP tool:
я использовал его для шифрования моего пароля "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:до
2 ответов
Я бы использовал некоторый инструмент защиты для программного обеспечения, например asprotect для шифрования exe-файла.
но в любом случае, как сказал Реми Лебо, FTP отправляет пароль в виде обычного текста, что является большой дырой в безопасности...
на самом деле не имеет значения, как вы храните пароль. Любой вид хранения, который вы используете, будет взломан с достаточной обратной инженерией. Рано или поздно текстовая версия должна быть расшифрована в памяти, прежде чем она будет передана TIdFTP, и есть инструменты (IDA и т. д.), которые могут просматривать эту память после дешифрования. Просто запустите исполняемый файл под отладчиком и поместите точку останова в Password
задатчик свойств или Connect
метод и просмотр памяти при попадании.
сделать хуже того, протокол FTP передает пароль в обычном тексте в любом случае, поэтому даже простой сниффер пакета, такой как Wireshark, сможет увидеть его без взлома исполняемого файла вообще, если вы не используете SSL (который Indy 9 и ранее не поддерживал FTP - обновление до Indy 10 для этого).