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:
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:
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:
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:
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:
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
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). –
Tienes razón, pero en aquel entonces cuando hice la pregunta, no sabía nada mejor :) – ziGi
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 ... –