如何在本地为多用户应用程序存储密码?

时间:2011-05-08 07:13:07

标签: delphi passwords delphi-7

我想创建一个多用户应用程序,但我不知道如何保存和读取加密密码。

procedure SavePass(Password: WideString);
var
  Pass: TIniFile;
begin
  Pass := TIniFile.Create(ChangeFileExt(Application.ExeName, '.PASS'));
  Pass.WriteString('Users', 'USERNAME', Password);
  Pass.Free;

密码必须存储在计算机上。 这有效,但使用它来保存密码是愚蠢的。 散列密码也很好。

6 个答案:

答案 0 :(得分:9)

如果连接软件接受散列密码,则不会阻止窃取散列密码的人员进行连接。它所要做的只是隐藏真实密码。

此外,如果您连接的软件不接受散列密码(数据库,网站等),您将必须以这样的方式存储您的密码,以便您可以将其恢复为它的原始状态。哈希版本不会帮助你。

如果您想要对存储进行加密,以便人类无法读取文件,您可以使用Windows.EncryptFile()Windows.DecryptFile()。在较新的Delphi中,它整齐地包含在IoUtils.TFile.Encrypt()IoUtils.TFile.Decrypt中。

如果您真的想阻止其他人阅读您的密码的明文版本,那么您将不得不使用密钥进行一些加密。那么你存储那个密钥在哪里?这将首先打败存储密码的全部目的。例如,通过使用文件系统的用户权限来防止其他用户访问会更好,因为您或您的软件可以执行任何操作,如果他具有相同的权限,则“黑客”可以执行此操作。

答案 1 :(得分:2)

您应该存储散列密码。例如,您可以使用Delphi Cryptography Package中的一种SHA算法。当您检查密码哈希时,用户提供的密码与文件中保存的密码进行比较。

您是否考虑过使用Windows安全性而不是尝试使用自己的安全性?


顺便说一句,如果您的程序位于程序文件目录下并且正在使用UAC,则可能会在写入程序目录时遇到问题。

答案 2 :(得分:2)

我的建议是不要在你的应用程序中使用密码,除非你真的需要。用户体验还有另一个密码输入&记住通常不需要。

我为我的应用程序做的是默认使用当前用户的域名和用户名作为标识。用户已经使用密码或更安全的系统登录(如果需要)。只有登录才能成为当前用户。然后我的服务器接受它作为他们的身份。

对此的变化包括可选地传递机器名称,以便在不同的计算机上对待相同的用户(当他们需要一次使用多个计算机时)。当然,如果你愿意,你仍然可以允许使用普通密码。

答案 3 :(得分:1)

Lockbox中有哈希和加密例程。您应该使用随机“salt”连接密码,并将salt和hash存储在一起。为了让人们更难以暴力破解哈希 - 尝试所有可能的密码,直到找到正确的密码 - 你应该迭代哈希。当用户随后输入他们的密码进行登录时,从商店中取盐并用输入的密码对其进行散列,然后进行迭代,并根据您存储的散列测试结果。如果他们是相同的,他们会给出正确的密码。

答案 4 :(得分:1)

  • 只要你可以,不要存储密码,但要正确地对它们进行哈希处理(使用盐,重复哈希n次等),因为彩虹表攻击是可行的,并且可以很好地应对糟糕的选择密码和过于简单的哈希。
  • 如果可能,请利用“集成安全性”。使用Windows authentication可以避免存储密码。
  • 如果您确实需要存储主密码等,请使用CryptProtectData之类的Windows API在本地保护它们。

答案 5 :(得分:0)

我认为最好将注册表中的用户特定设置保存在HKEY_CURRENT_USER下。这将使他们的设置保持在一起并与其他用户的设置分开。

当您从注册表的这个区域读取时,您将自动阅读正确的用户设置,并且您也应该在那里存储您的密码。是的,请按照David的建议对其进行加密。任何人都可以使用RegEdit轻松阅读注册表。

这是an article on how you can write to and read from the registry