Delphi 7 TIdFTP Безопасность FTP (защита паролем)

В последнее время я имел дело с 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 с помощью ключевого слова «лимон». Затем я взял зашифрованную строку 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

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

enter image description here

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

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

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

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

9
задан bluish 7 March 2013 в 09:19
поделиться