我需要“密码保护”我的应用程序,但需要有关安全存储密码的建议。
我打算如何做到这一点:
第一次运行程序时,我会提示用户创建密码。密码将被盐化并在SHA-256中进行散列,然后存储在注册表或文件中。
问题:
如果我将散列密码存储在注册表或文件(或两者)中,那么有人只需删除注册表或文件中的密钥并提示您创建新密码...... < / p>
如何安全地存储哈希密码,以便更难删除?
我已经考虑将它存储在注册表中,并且还创建了一个带有隐藏和系统属性的文件,以便在删除注册表文件的情况下读取,但这看起来很愚蠢,因为它也可以很容易地删除。
//我希望我已经用正确的标签正确发布了这个问题 - 我是新来的,所以请放心! ;)
一切顺利
克里斯(Shamballa)答案 0 :(得分:15)
这基本上是编程道德101问题。如果您将信息存储在其他人的计算机上,请记住该计算机是他们的财产,他们有权删除或修改其上的任何文件或注册表项。试图让它们成为一个非常糟糕的主意。
有一个很好的理由让你无法做到。如果有人开始在您的计算机上放置无法删除或修改的文件,会发生什么?根据逻辑结论推断:如果病毒开始在您的计算机上放置无法删除或修改的文件,并且在硬盘驱动器已满之前无限循环,会发生什么?如果有可能,你知道,有人会尝试。
如果您希望程序在用户无法修改密码的地方存储密码,请将其放在服务器上,让程序通过Internet连接与其联系。 (这是一种完全不同的蠕虫病毒,但至少你不会试图做不可能的事情或侵犯用户的基本财产权。)
答案 1 :(得分:5)
您没有真正指定此密码保护的内容。我会假设它用于保护程序创建的数据。
我不是安全专家或密码学家,但如果数据存储在本地,解决方案很简单。将密码(或更可能是密码的哈希值)和数据存储在同一位置(文件,数据库等),并使用单独的密钥加密。
这可以防止文件删除。他们也会删除所有数据。除了最坚定的最终用户之外,这将阻止所有人。
答案 2 :(得分:4)
您可以使用Windows crypto API安全地存储应用程序的密码。它有一个在CodeGuru中使用的例子,但它是用C ++编写的,而不是Delphi。代码不是太具有挑战性,所以应该相对容易地转换为Delphi。
更高级的解决方案是在下载应用程序之前询问用户密码,并将哈希密码嵌入二进制文件中 - 当然,如果您获得了应用程序的多个副本,则可以轻松确定加密位置值,以及检查它以删除它的代码。
问题是您没有使用密码创建任何值,即它似乎只是一个密码。您应该使用密码作为加密应用程序数据的种子,并将密码绑定到数据。丢失密码,您只会丢失数据。
答案 3 :(得分:3)
最好的解决方案是依靠用户无法控制的外部源来存储密码的一部分。否则无论你在哪里隐藏它,都可以通过一些免费工具和一点时间轻松发现它。
就个人而言,我发现存储这些数据的最佳位置是开放的,以及应用程序经常访问的其他数据。请记住,如果用户有权修改数据,则存在风险。
如果要锁定程序,请在程序运行之前要求密钥已存在。这样你只需要担心如何获得密钥,并且由于它是加密的,因此他们很难创建一个适用于你的系统的密钥。
对于初始身份验证过程,您可以将密钥的一部分放在Web服务器上,为用户提供创建加密文件所需的密钥。使用密钥会将它们引导到服务器上的密钥,如果它有效,则允许它们保存加密文件。如果您担心重新激活,那么一旦激活,您就可以删除Web服务器上的文件。
另一种选择是使用类似OnGuard(latest versions)的内容来编码您为用户提供的限时键。然后,当运行激活时,检查您提供的密钥是否已过期,如果是,则不允许激活。这样,您的激活密钥只会在有限的时间内处于危险之中。
不要花太多时间在这上面。在部署应用程序后,即使是最好的算法也可以通过一些NOP指令进行修补。
答案 4 :(得分:1)
至少有两种方法可以解释你的问题。
(1)您希望存储密码,以便以后可以使用它们登录远程数据库。
This answer上的{p> Password encryption in Delphi解释了加密部分。这样您就可以存储密码,以便以后可以在用户使用数据库服务器上的应用程序登录时对用户进行身份验证。
“不删除”部分对用户非常敏感;我不会这样做。
(2)您想存储密码,因此可以用来验证用户本地访问您的应用程序。
这更难,因为基本上你不能。
最接近的方法是保持后台进程运行以锁定文件 您与该进程通信以解锁文件,以便您可以验证密码。
- 的Jeroen
答案 5 :(得分:1)
根据您的描述判断,如果您拥有的所有安全措施都是
,则您不明白if not SameString(Hash(UserPassword), StoredPassword) then exit;
然后你根本没有安全性,这不是用户删除密码文件的问题。用户可以在任何二进制编辑器中打开您的exe文件,并清除执行检查的部分:
//if not SameString(Hash(UserPassword), StoredPassword) then exit;
//Check commented out ---malicious user
你必须意识到即使你编译你的应用程序,它仍然包含所有源代码,只是在汇编程序中。你仍然可以编辑源代码,这有点困难,因为它现在使用不同的语言。
因此,如果您想阻止用户在您的应用中执行某些操作,则只有两种方法:
对您的应用及其文件进行写保护。或者将它们存储在单独的服务器上,如果你不能控制它。或者只是让它们成为只接受一组固定命令的服务。
使其成为应用程序不检查它,但加密一些关键密码的东西。当然,恶意用户可以重置密码甚至完全删除解密例程,但他仍然需要解密数据。
其他所有解决方案都可以被规避,所有不同之处在于规避时间和技能。例如,您可以加密应用程序代码的关键部分并即时解密(执行一次)。然后执行并加密回来。如果没有正确的密码,您的应用将无法运行。
但恶意用户可以使用已知密码安装应用程序的单独副本,在解密时检查程序的各个部分并将其组装到未加密的源中。当然,这是很多工作。但它可以在有限的时间内完成。
答案 6 :(得分:0)
如果您只需要一个密码,请在.exe结尾处对其进行加密和修复。我成功地做了很多次。
答案 7 :(得分:0)
我建议在Windows中使用身份验证功能,特别是CredWrite和CredRead。也可以使用加密窗口提供(CryptProtectData / CryptProtectMemory)然后保存凭据
编辑:如果您需要Delphi的标题,可以在Jedi Windows Api Library中找到它们。