Ho avuto a che fare con FTP ultimamente e non sono sicuro della sicurezza del componente Indy TIdFTP
. Questo è il motivo per cui ho creato alcuni test che voglio condividere con te in modo che tu possa esprimere la tua opinione sulle migliori pratiche e su come è fatta.Delphi 7 TIdFTP Protezione FTP (protezione password)
Prima di tutto ho solo aggiunto il nome utente e la password nella componente utilizzando Inspector:
e ha creato una semplice connessione che funziona bene:
procedure TForm1.FormActivate(Sender: TObject);
begin
try
FTP.Connect();
ShowMessage ('Connection success');
except
ShowMessage ('Connection failure');
end;
end;
Il problema con questo metodo è che se si utilizza un semplice strumento come Resource Hacker è possibile vedere immediatamente tutti i dati:
Host = 'ivstefano.com'
Password = 'testpass'
Username = 'testuser'
Poi ho deciso di essere un po 'più intelligente rimuovendolo dal OI e inserendolo nel codice come fanno tutti gli altri:
FTP.Host:= 'ivstefano.com';
FTP.Username:= 'testuser';
FTP.Password:= 'testpass';
Eppure se qualcuno è più intelligente che può utilizzare con facilità un certo strumento come Hex editor e vedere ciò che è in compilato in exe:
Quindi quello che ho fatto è stato finalmente a fare uno strumento di crittografia che utilizza OTP (One Time Pad Wiki), che si può scaricare da qui Sample OTP tool:
L'ho usato per crittografare la mia password 'testpass' con la parola chiave 'limone'. Poi ho preso la stringa OTP crittografata (#25+#2+#3+#7+#117+#19+#31+#6
) e il tasto (#108+#101+#109+#111+#110
), sia nella somma di caratteri ASCII e usato nel mio programma di connessione FTP principale per decifrare utilizzando di nuovo 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;
E come si può vedere si connette correttamente:
e se guardiamo al Hex nuovo possiamo vedere che la frase chiave e la password crittografata sono qui, ma almeno non la password di testo normale:
Conclusione: Ancora, il "hacker" può vedere la frase chiave e il passo cifrato, ma che sta per essere più difficile da indovinare come decifrare il passo con la chiave perché deve decodificare il codice e vedere che cosa tipo di crittografia che ho usato. Fondamentalmente posso inventare la mia crittografia e decrittografia, quindi non è necessario l'OTP, ma se qualcuno è più avanzato, potrebbe ancora vedere il modo in cui decrittografo la password crittografata e accedo al mio FTP applicandolo al passaggio crittografato usando la chiave.
PENSIERI AGGIUNTIVI: Forse offuscare il codice Delphi sarebbe una scelta migliore?
DOMANDA: Qual è un modo migliore di proteggere la password?
FONTI: Qui possono trovare i codici sorgente per il generatore FTPTester e OTP: Link to both
Nota che ciò che si sta mostrando non è un'OTP. Un OTP (one-time pad) utilizza una chiave della stessa lunghezza dei dati da proteggere (e la chiave deve essere perfettamente casuale). –
Hai ragione, ma allora quando ho posto la domanda, non ne sapevo di più :) – ziGi
Nulla ti impedisce di modificare la domanda almeno. :) OTP deve essere lo schema di crittografia più incompreso di tutti i tempi, eppure il più semplice ... –