使'明文'字符串不被破解?

时间:2011-12-01 18:48:21

标签: security delphi

假设我的程序中有一个重要的密码,我想让它更安全,例如:

ftp.password := 'mypassword';

大约8年前,我用'破解东西'来获得乐趣,所以我很容易通过使用OllyDbg找到了这样的东西。

我需要知道的是,是否有办法让这件东西不被窥探。我想过将密码直接存储到组件中,但是再次不知道它是否会有用。

6 个答案:

答案 0 :(得分:17)

就是不要这样做。如果要保证密码安全,请不要将其放入程序中。如果程序是交互式的,您可以询问用户。如果没有,您应该为要使用的程序设置某种非基于密码的身份验证。

如果您必须在程序中嵌入密码,则规则非常简单 - 永远不要将程序交给任何不应该做密码允许他们做的事情的人。

答案 1 :(得分:5)

虽然你不应该这样做的答案是正确的,但在实践中,有时候现实世界迫使你动手。在一两个实例中,我被迫使用的方法类似于我使用的方法是编写一个函数,它将使用一些数学公式从头开始生成一个已知的密码 - 例如,英语单词的第一个字母为PI的前8位数字按相反顺序排列。当然,这仍然可以解决,但它会使任务变得更加困难,并且应该阻止随意的浏览器。

当然,如果您真的使用FTP(而不是SFTP),那么无论如何您都要以纯文本形式传递密码。我最初会更关注它 - 它是一个更明显的攻击向量。

答案 2 :(得分:4)

虽然我完全同意David Schwartz(你不应该直接在程序中嵌入任何密码),但是有可能让任何人找到它更难

您可以在程序上构建字符串,而不是将字符串定义为一个字符串。这样,字符串作为一个整体永远不会存储在可执行文件中的一个部分中,这使得查找更加困难。

答案 3 :(得分:3)

这不是加密可以解决的问题。保护此值的唯一方法是依赖操作系统提供的用户访问控制。确保文件的权限尽可能受限。 chown user:user file然后chmod 400 file

答案 4 :(得分:2)

这是一种方式 - 它使用十六进制查看器保护它不受好奇的人的影响,但当然在运行时不能使用高级技术:

function GetA: string;
begin
  Result := #$109#$121#$122;  // 'myp'
end;

function Getb: string;
begin
  Result := #97#$115#$115#$119;  // 'assw'
end;

function GetC: string;
begin
  Result := #$111#$114#$100;  // 'ord'
end;

procedure TForm1.Whatever;
begin
  ftp.Password := GetA + GetB + GetC + GetD;
end;

正如我所说,在使用调试器执行代码期间设置中断并在设置后检查内存中的ftp.password并不安全,但是从十六进制查看器中可以安全地使用它。对于那些喜欢尝试的人,我通常会将ftp.password的设计时值设置为DoyouthinkImthatstupid?

答案 5 :(得分:1)

也许你可以加密字符串,并在阅读时解密它?

但即便如此,正如其他人所说,在应用程序内部存储密码并不是一个好主意。

即使你对字符串进行编码或加密,它也不会对确定的人安全。