我想创建一个多用户应用程序,但我不知道如何保存和读取加密的密码。
procedure SavePass(Password: WideString);
var
Pass: TIniFile;
begin
Pass := TIniFile.Create(ChangeFileExt(Application.ExeName, '.PASS'));
Pass.WriteString('Users', 'USERNAME', Password);
Pass.Free;密码必须存储在计算机上。这是可行的,但是用它保存密码是愚蠢的。散列密码也很好。
发布于 2011-05-08 16:29:53
如果连接软件接受哈希密码,它不会阻止窃取哈希密码的人进行连接。它所要做的就是隐藏真实的密码。
此外,如果您连接的软件不接受哈希密码(数据库、网站等),您将不得不以这样一种方式存储您的密码,以便您可以将其恢复到原始状态。散列版本在这一点上帮不了你。
如果你想打乱你的存储,这样人们就不能读取文件,你可以使用Windows.EncryptFile()和Windows.DecryptFile()。在较新的Delphi中,它被整齐地包装在IoUtils.TFile.Encrypt()和IoUtils.TFile.Decrypt中。
如果你真的想阻止其他人读取你的明文版密码,你必须使用一些带有密钥的加密。那么你把密钥存储在哪里呢?这会违背存储密码的全部目的。例如,最好通过使用用户权限来防止其他用户访问文件系统,因为您或您的软件可以做的任何事情,“黑客”都可以做,如果他拥有相同的权限。
发布于 2011-05-08 18:15:02
我的建议是,除非你真的需要,否则不要在你的应用程序中使用密码。用户体验通常不需要输入和记住另一个密码。
对于我的应用程序,我默认使用当前用户的域名和用户名作为标识。用户已经使用密码登录,如果他们需要,也可以使用更安全的系统登录。只有通过登录,他们才能成为当前用户。然后,我的服务器接受它作为它们的标识。
它的变体还包括可选的传递机器名,以便同一用户在不同的计算机上得到不同的对待(当他们需要同时使用多台计算机时)。当然,如果你愿意,你仍然可以允许一个普通的密码。
发布于 2011-05-08 15:26:26
您应该存储散列密码。例如,您可以使用Delphi Cryptography Package中的一种SHA算法。当您检查密码时,对用户提供的密码进行散列,并与保存在文件中的密码进行比较。
您是否考虑过使用Windows安全性,而不是尝试使用自己的安全性?
另外,如果您的程序驻留在程序文件目录下,并且UAC正在使用中,则很容易在写入程序目录时遇到问题。
https://stackoverflow.com/questions/5926126
复制相似问题