【发布时间】:2012-02-11 13:14:13
【问题描述】:
我最近一直在处理 FTP,我不确定 Indy 组件 TIdFTP 的安全性。这就是为什么我创建了一些测试并希望与您分享,以便您对最佳实践以及如何完成提出您的意见。
首先,我刚刚使用对象检查器在组件中添加了用户名和密码:
并创建了一个运行良好的简单连接:
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';
如果有人更聪明,他可以轻松地使用一些工具,如 Hex 编辑器,并查看 exe 中编译的内容:
所以我最终做了一个使用 OTP(One Time Pad Wiki) 的加密工具,你可以从这里下载 Sample OTP tool:
我用它来加密我的密码“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(一次性密码)使用与要保护的数据长度相同的密钥(并且密钥必须完全随机)。
-
你是对的,但是当我问这个问题时,我不知道更好:)
-
没有什么能阻止你至少修改问题。 :) OTP 一定是有史以来最容易被误解的加密方案,但也是最简单的......
标签: delphi security encryption ftp delphi-7