2011-12-01 72 views
7

假如我在我的计划有一个重要的密码的地方,我想使它更安全,例如:使“明文”字符串安全无损?

ftp.password := 'mypassword'; 

大约8年前,我用它来“破解东西”的乐趣,让我找到了我这样的东西很容易通过使用OllyDbg。

我需要知道的是,是否有办法让这件东西安全无虞。我想直接将密码存储到组件中,但是再次不知道它是否会有好处。

+4

不要存储密码。哈希然后存储密码。 –

+2

@David Heffernan - 如果这些密码需要发送到另一个应用程序/服务(例如连接到FTP服务器),那么这将不起作用。 – crashmstr

+2

@crash ftp不安全 –

回答

17

只是不这样做。如果您想保持密码安全,请勿将其放入程序中。如果程序是交互式的,你可以询问用户。如果没有,您应该为程序设置一些非密码认证。

如果您必须将密码嵌入到程序中,则该规则非常简单 - 绝对不要将该程序授予任何不能执行密码允许的任何操作。

+0

嗯,也许如果我为程序制作一个用户,即使有人确实得到了它,它也会更安全一点,但它们不会走得太远。 –

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?的值。

4

尽管我完全同意David Schwartz(你不应该直接在程序中嵌入任何密码),但是任何人都可以通过更难找到它。

不是将字符串定义为一个整体,而是可以通过程序构建字符串。这样,字符串作为一个整体永远不会被存储在您的可执行文件中,因此更难以找到。

+0

这是一个合理的答案,好主意。 –

5

虽然你不应该这样做的答案是正确的,但在实践中有时候现实世界会迫使你交出。在一个或两个实例中,我被迫采用了类似于我使用的方法的一种方法,即编写一个函数,该函数将使用一些数学公式从头开始生成已知的密码 - 例如,英文单词的第一个字母倒数第一个8位数字的PI。当然,这仍然可以被破解,但它会让这项任务变得更加困难,并且会妨碍偶然的浏览器。

当然,如果你真的使用FTP(而不是SFTP),那么你仍然通过网络以纯文本传递密码。最初我会更关心 - 这是一个更明显的攻击媒介。

+0

+1我会在打开调试器之前嗅探网络流量。这很简单。 –

3

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

1

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

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

即使您编码或加密了字符串,它也不会对确定的人员安全。