2012-02-11 19 views
9

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: enter image description here

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: enter image description here

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:

enter image description here

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:

enter image description here

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:

enter image description here

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

+1

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). –

+0

Hai ragione, ma allora quando ho posto la domanda, non ne sapevo di più :) – ziGi

+0

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 ... –

risposta

2

Vorrei usare qualche strumento di protezione per i software, come asprotect per crittografare il file exe.

Ma comunque, come ha detto Remy Lebeau FTP invia la password come testo normale, che è un grosso buco di sicurezza ...

5

Non ha veramente importa come si memorizza la password. Qualsiasi tipo di storage che utilizzi sarà hackerabile con un sufficiente reverse engineering. Prima o poi, la versione in testo semplice deve essere decifrata in memoria prima che venga passata a TIdFTP, e ci sono strumenti (IDA, ecc.) Che possono visualizzare quella memoria dopo la decrittografia. Basta eseguire l'eseguibile sotto un debugger e posizionare un punto di interruzione nel setter della proprietà Password o nel metodo Connect e visualizzare la memoria quando viene colpito.

A peggiorare le cose, il protocollo FTP trasmette la password in formato testo comunque, quindi anche solo un packet sniffer pianura, come Wireshark, sarà in grado di vedere senza l'hacking l'eseguibile a tutti, a meno che non si utilizza SSL (quale Indy 9 e precedenti non supportavano l'FTP - l'aggiornamento a Indy 10 per quello).