2012-02-11 3 views
9

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

Прежде всего, я просто добавил имя пользователя и пароль в компоненте с помощью инспектора объектов: 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), который вы можете скачать здесь Sample OTP tool:

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

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

enter image description here

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

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

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

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

+1

Обратите внимание, что то, что вы показываете не является OTP. OTP (одноразовый блок) использует ключ той же длины, что и данные, которые необходимо защитить (и ключ должен быть совершенно случайным). –

+0

Вы правы, но тогда, когда я задал вопрос, я не знал ничего лучшего :) – ziGi

+0

Ничто не мешает вам хотя бы изменить вопрос. :) OTP должна быть самой непонятной схемой шифрования всех времен, но самая простая ... –

ответ

2

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

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

5

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

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

Смежные вопросы