Delphi 7 TidFTP FTP安全(密码保护)

Delphi 7 TIdFTP FTP security (password protection)

我最近一直在处理ftp,我不确定indy组件TIdFTP的安全性。这就是为什么我创建了一些测试,我想与您分享,这样您就可以给出最佳实践的意见,以及如何完成。

首先,我使用对象检查器在组件中添加了用户名和密码:enter image description here

并创建了一个简单的连接,它可以很好地工作:

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中编译的内容:enter image description here

所以我最后做的是使用otp(一次性pad wiki)制作一个加密工具,您可以从这里下载示例otp工具:

enter image description here

我用它来加密我的密码"testpass"和关键字"lemon"。然后我取了OTP加密字符串(#25+#2+#3+#7+#117+#19+#31+#6和密钥(#108+#101+#109+#111+#110两个字符的ASCII和),并在我的主FTP连接程序中使用它们再次使用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;

如你所见,它正确地连接着:

enter image description here

如果我们再看一次十六进制,我们可以看到这里有密钥短语和加密密码,但至少不是纯文本密码:

enter image description here

结论:尽管如此,"黑客"仍然可以看到密码短语和加密的密码,但很难猜测如何使用密钥解密密码,因为他必须对代码进行反向工程,并查看我使用的是哪种加密。基本上,我可以发明自己的加密和解密,因此不需要OTP,但如果有人更高级,他仍然可以看到我解密加密密码的方式,并通过使用密钥将其应用到加密密码来访问我的FTP。

其他想法:也许混淆Delphi代码会是一个更好的选择?

问题:如果有的话,保护密码的更好方法是什么?

来源:这里可以找到ftptester和otp生成器的源代码:链接到两者


如何存储密码并不重要。您使用的任何类型的存储都可以通过足够的逆向工程进行黑客攻击。早晚,在将纯文本版本传递给tidfp之前,必须在内存中对其进行解密,并且有一些工具(ida等)可以在解密之后查看该内存。只需在调试程序下运行可执行文件,并在Password属性setter或Connect方法中放置一个断点,点击时查看内存。

更糟糕的是,ftp协议以明文形式传输密码,所以即使是像wireshark这样的普通包嗅探器,也可以在不攻击可执行文件的情况下看到它,除非您使用ssl(indy 9和更早版本不支持ftp升级到indy 10)。


我会对软件使用一些保护工具,比如asprotect来加密您的exe文件。

但无论如何,正如雷米·勒博所说,ftp以明文形式发送密码,这是一个巨大的安全漏洞…