【问题标题】:Delphi 7 TIdFTP FTP security (password protection)Delphi 7 TIdFTP FTP 安全(密码保护)
【发布时间】: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


【解决方案1】:

如何存储密码并不重要。您使用的任何类型的存储都可以通过足够的逆向工程来破解。迟早,纯文本版本必须在内存中解密,然后才能传递给 TIdFTP,并且有工具(IDA 等)可以在解密发生后查看该内存。只需在调试器下运行可执行文件并在Password 属性设置器或Connect 方法中放置一个断点,并在命中时查看内存。

更糟糕的是,FTP 协议无论如何都会以纯文本形式传输密码,因此即使是纯数据包嗅探器(如 Wireshark)也可以在完全不破解可执行文件的情况下看到它,除非您使用 SSL( Indy 9 及更早版本不支持 FTP - 为此升级到 Indy 10。

【讨论】:

    【解决方案2】:

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

    但无论如何,正如 Remy Lebeau 所说,FTP 以纯文本形式发送密码,这是一个很大的安全漏洞......

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多