Delphi 7 TIdFTP FTP security (password protection)
我最近一直在处理ftp,我不确定indy组件
首先,我使用对象检查器在组件中添加了用户名和密码:
并创建了一个简单的连接,它可以很好地工作:
1 2 3 4 5 6 7 8 9 | procedure TForm1.FormActivate(Sender: TObject); begin try FTP.Connect(); ShowMessage ('Connection success'); except ShowMessage ('Connection failure'); end; end; |
这个方法的问题在于,如果您使用像资源黑客这样的简单工具,您可以立即看到所有这些数据:
1 2 3 | Host = 'ivstefano.com' Password = 'testpass' Username = 'testuser' |
然后,我决定像其他人一样,从OI中删除它并将其插入代码中,从而变得更聪明一点:
1 2 3 | FTP.Host:= 'ivstefano.com'; FTP.Username:= 'testuser'; FTP.Password:= 'testpass'; |
不过,如果有人更聪明,他可以轻松地使用一些工具,如hex编辑器,并查看在exe中编译的内容:
所以我最后做的是使用otp(一次性pad wiki)制作一个加密工具,您可以从这里下载示例otp工具:
我用它来加密我的密码"testpass"和关键字"lemon"。然后我取了OTP加密字符串(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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生成器的源代码:链接到两者
如何存储密码并不重要。您使用的任何类型的存储都可以通过足够的逆向工程进行黑客攻击。早晚,在将纯文本版本传递给tidfp之前,必须在内存中对其进行解密,并且有一些工具(ida等)可以在解密之后查看该内存。只需在调试程序下运行可执行文件,并在
更糟糕的是,ftp协议以明文形式传输密码,所以即使是像wireshark这样的普通包嗅探器,也可以在不攻击可执行文件的情况下看到它,除非您使用ssl(indy 9和更早版本不支持ftp升级到indy 10)。
我会对软件使用一些保护工具,比如asprotect来加密您的exe文件。
但无论如何,正如雷米·勒博所说,ftp以明文形式发送密码,这是一个巨大的安全漏洞…