我一直在處理FTP最近,我不確定Indy組件TIdFTP
的安全性。這就是爲什麼我創建了一些我想與你分享的測試,這樣你就可以給出你對最佳實踐的看法以及它是如何完成的。Delphi 7 TIdFTP FTP安全(密碼保護)
首先,我只是用Object Inspector中添加的組件的用戶名和密碼:
而且創建了一個簡單的連接效果很好:
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';
不過,如果有人是聰明的,他可以輕鬆地使用像十六進制編輯器的一些工具,看看什麼是在編譯的exe:
所以我最後還是用OTP(One Time Pad Wiki),你可以從這裏下載Sample OTP tool的加密工具,使:
我用它用關鍵字'lemon'加密我的密碼'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;
,正如你所看到它連接正確:
如果我們看一下六角再次,我們可以看到的關鍵詞和加密的密碼都在這裏,但至少沒有明文密碼:
結論:儘管如此,「黑客」可以看到的關鍵詞和加密的口令,但將是更難猜測如何使用的關鍵,因爲他要逆向工程代碼,看看解密通是什麼我用過的加密類型。基本上我可以發明我自己的加密和解密,所以它不是必需的OTP,但如果有人更先進,他仍然可以看到我解密加密密碼的方式,並通過將密鑰應用於加密密碼來訪問我的FTP。
其他想法:也許混淆Delphi代碼將是一個更好的選擇?
問題:什麼是保護密碼的更好方法?
來源:這裏可以找到的FTPTester和OTP生成源代碼:Link to both
注意,你所展示的不是一個OTP。 OTP(一次性鍵盤)使用與要保護的數據長度相同的鍵(並且鍵必須是完全隨機的)。 – 2014-08-12 12:15:29
你是對的,但當時我問這個問題,我不知道更好:) – ziGi 2014-08-12 12:19:36
沒有什麼能阻止你至少修改問題。 :) OTP必須是所有時間中最容易被誤解的加密方案,但是最簡單的... – 2014-08-12 12:24:19