Delphi 7 TIdFTP FTP безопасность (защита паролем) - PullRequest
9 голосов
/ 11 февраля 2012

В последнее время я имею дело с FTP и не уверен насчет безопасности компонента Indy TIdFTP. Вот почему я создал несколько тестов, которыми хочу поделиться с вами, чтобы вы могли высказать свое мнение о передовых практиках и о том, как это делается.

Прежде всего, я просто добавил имя пользователя и пароль в компонент, используя инспектор объектов: enter image description here

И создал простое соединение, которое хорошо работает:

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: enter image description here

Итак, я наконец-то сделал инструмент шифрования с использованием OTP ( One Time Pad Wiki ), который вы можете загрузить здесь Пример инструмента OTP :

enter image description here

Я использовал его для шифрования пароля «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;

И, как вы видите, он подключается правильно:

enter image description here

И если мы снова посмотрим на Hex, то увидим, что здесь есть ключевая фраза и зашифрованный пароль, но, по крайней мере, пароль в виде простого текста:

enter image description here

Заключение. Тем не менее, «хакер» может видеть ключевую фразу и зашифрованный проход, но будет сложнее угадать, как расшифровать проход, используя ключ, потому что он должен выполнить обратный инжиниринг кода и посмотреть, какой тип шифрования Я использовал. По сути, я могу изобрести свое собственное шифрование и дешифрование, поэтому нет необходимости в OTP, но если кто-то более продвинут, он все равно может увидеть, как я расшифрую зашифрованный пароль и получаю доступ к своему FTP, применяя его к зашифрованному проходу с помощью ключа.

ДОПОЛНИТЕЛЬНЫЕ МЫСЛИ: Может быть, было бы намного лучше сделать запутывание кода Delphi?

ВОПРОС: Как лучше защитить свой пароль, если таковой имеется?

ИСТОЧНИКИ: Здесь можно найти исходные коды для генератора FTPTester и OTP: Ссылка на оба

Ответы [ 2 ]

5 голосов
/ 11 февраля 2012

Неважно, как вы храните пароль.Любой тип хранилища, который вы используете, будет взломан с достаточным количеством методов обратного инжиниринга.Рано или поздно текстовая версия должна быть дешифрована в памяти перед ее передачей в TIdFTP, и есть инструменты (IDA и т. Д.), Которые могут просматривать эту память после дешифрования.Просто запустите исполняемый файл в отладчике и поместите точку останова в установщик свойств Password или метод Connect и просмотрите память при попадании.

Что еще хуже, протокол FTP передает пароль в виде простого текстав любом случае, даже простой анализатор пакетов, такой как Wireshark, сможет увидеть его, не взламывая исполняемый файл вообще, если только вы не используете SSL (который в Indy 9 и более ранних версиях не поддерживал FTP - для этого обновите до Indy 10).

2 голосов
/ 13 февраля 2012

Я бы использовал какой-нибудь инструмент защиты для программ, например asprotect для шифрования вашего exe-файла.

Но в любом случае, как сказал Реми Лебо, FTP отправляет пароль в виде простого текста, что является большой дырой в безопасности ...

...