Delphi 7 TIDFTP FTP security (защита паролем)

в последнее время я имею дело с 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 editor и посмотреть, что в скомпилированном в exe: enter image description here

так что я, наконец, сделал, чтобы сделать инструмент шифрования с помощью OTP (один Time Pad Wiki), который вы можете скачать здесь образец OTP tool:

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 ответов


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

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


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

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