2012-02-11 26 views
9

He estado tratando con FTP últimamente y no estoy seguro acerca de la seguridad del componente Indy TIdFTP. Es por eso que he creado algunas pruebas que quiero compartir contigo para que puedas dar tu opinión sobre las mejores prácticas y cómo se hace.Delphi 7 TIdFTP Seguridad FTP (protección con contraseña)

En primer lugar me acaba de agregar el nombre de usuario y contraseña en el componente mediante el inspector de objetos: enter image description here

y ha creado una conexión simple que funciona bien:

procedure TForm1.FormActivate(Sender: TObject); 
begin 
    try 
    FTP.Connect(); 
    ShowMessage ('Connection success'); 
    except 
    ShowMessage ('Connection failure'); 
    end; 
end; 

El problema con este método es que si utiliza una herramienta sencilla como Resource Hacker, puede ver inmediatamente todos esos datos:

Host = 'ivstefano.com' 
Password = 'testpass' 
Username = 'testuser' 

Entonces decidí ser un poco más inteligente quitándolo de la OI e insertarlo en el código que hace todo el mundo:

FTP.Host:= 'ivstefano.com'; 
FTP.Username:= 'testuser'; 
FTP.Password:= 'testpass'; 

Aún si alguien es más inteligente que se puede utilizar con facilidad alguna herramienta como editor hexadecimal y ver lo que está en compilada en el exe: enter image description here

Así que lo que finalmente hice fue hacer una herramienta de cifrado usando OTP (One Time Pad Wiki), que se puede descargar de aquí Sample OTP tool:

enter image description here

Lo usé para encriptar mi contraseña 'testpass' con la palabra clave 'lemon'. Entonces tomé la cadena OTP cifrado (#25+#2+#3+#7+#117+#19+#31+#6) y la clave (#108+#101+#109+#111+#110), tanto en cantidad de caracteres ASCII y los utilicé en mi programa principal conexión ftp para descifrarlos usando OTP nuevo:

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; 

y como se puede ver que se conecta correctamente:

enter image description here

y si nos fijamos en el hexagonal de nuevo podemos ver que la frase clave y la contraseña cifrada están aquí, pero al menos no la contraseña en texto plano:

enter image description here

Conclusión: Aún así, el "hacker" puede ver la frase clave y el paso cifrada pero va a ser más difícil de adivinar cómo descifrar el pase usando la clave porque tiene que realizar ingeniería inversa del código y ver lo tipo de encriptación que he usado Básicamente puedo inventar mi propio cifrado y descifrado, por lo que no es necesario OTP, pero si alguien está más avanzado todavía podría ver la forma en que descifrar la contraseña cifrada y acceder a mi FTP aplicándolo al pase encriptado con la clave.

PENSAMIENTOS ADICIONALES: Tal vez ofuscar el código Delphi sería una opción mucho mejor?

PREGUNTA: ¿Cuál es una mejor manera de proteger su contraseña, si la hay?

FUENTES: Aquí puede encontrar los códigos fuente para el generador FTPTester y OTP: Link to both

+1

Tenga en cuenta que lo que se está demostrando que no es una OTP. Un OTP (pad de una sola vez) utiliza una clave con la misma longitud que los datos que se protegerán (y la clave debe ser perfectamente aleatoria). –

+0

Tienes razón, pero en aquel entonces cuando hice la pregunta, no sabía nada mejor :) – ziGi

+0

Nada te impide, al menos, modificar la pregunta. :) OTP debe ser el esquema de cifrado más incomprendido de todos los tiempos, sin embargo, el más simple ... –

Respuesta

2

Yo usaría alguna herramienta de protección para software, como asprotect para encriptar su archivo exe.

Pero de todos modos como Remy Lebeau dijo FTP envía la contraseña como texto sin formato, que es un gran agujero de seguridad ...

5

Realmente no importa cómo se almacena la contraseña. Cualquier tipo de almacenamiento que use será pirateable con suficiente ingeniería inversa. Tarde o temprano, la versión de texto sin formato debe descifrarse en la memoria antes de pasarla a TIdFTP, y hay herramientas (IDA, etc.) que pueden ver esa memoria después de que se produce el descifrado. Simplemente ejecute el archivo ejecutable debajo de un depurador y coloque un punto de interrupción en el conjunto de propiedades Password o el método Connect y vea la memoria cuando lo presione.

Para empeorar las cosas, el protocolo FTP transmite la contraseña en texto plano de todos modos, por lo que incluso un simple sniffer de paquete, como Wireshark, podrá verlo sin hackear el ejecutable, a menos que use SSL (Indy 9 y anteriores no eran compatibles con FTP: actualice a Indy 10 para eso).

Cuestiones relacionadas