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