我应该使用什么算法来加密和嵌入应用程序的密码?

时间:2010-06-14 12:39:34

标签: passwords encryption

我应该使用什么算法来加密和嵌入应用程序的密码?

它显然不是防弹,但它应该足以阻止某人使用十六进制编辑器扫描数据库,或者让那些有技能的人难以使用调试器来跟踪代码的运行情况,或者扫描加密密码,或使用调试器运行解密代码。

Object Pascal会很好。

主要编辑

我想我的解释不够好。密码需要解密回原始形式并应用。应用程序本身使用本地SQL数据库和本地Web服务器,密码是固定的,最终用户无法更改。这是为了确保只在应用程序本身内进行更改。用户密码仅允许访问应用程序本身,而不是数据库

/ vfclists

7 个答案:

答案 0 :(得分:1)

如果你想要一个简单的解决方案,只需坚持使用良好的散列算法,如 MD5 ,并在你的应用程序中存储哈希。然后,每当用户插入密码时,您将计算密码的散列并检查它是否等于存储的密码。

当然这种方法是一个简单的解决方案,如果丢失密码就不允许你检索密码,但是如果你需要一些保护它应该可以正常工作。

编辑:我提到MD5 非常好但不再是,当然你可以选择任何其他更强大的功能,如 SHA-2 (512/384)更强大。我只是想解释一种方法而不是使用特定的散列算法。

答案 1 :(得分:0)

SHA应该对你好,最好用盐。

我不太了解Object Pascal,但这可能对您有所帮助: http://sourceforge.net/projects/op-crypt/

答案 2 :(得分:0)

当应用程序只需要进行密码检查时,最好保存一个哈希值。哈希不能被解密,但可以检查用户输入的密码是否具有相同的哈希值。

如果您想保存密码以便可以恢复密码,最好先使用密码库加密密码。

答案 3 :(得分:0)

我会建议SHA1,它的单向加密,我之前使用过它,到目前为止还没有人解密过它! 如果您需要有关sha1的更多信息,请访问http://en.wikipedia.org/wiki/Secure_Hash_Algorithmhttp://www.openssl.org/docs/crypto/sha.html

PS:如果您使用的是php,可以使用sha1()简单地使用SHA1加密;功能!

答案 4 :(得分:0)

我怀疑你的目标不是将密码存储在应用程序中,而是试图阻止应用程序本身在没有密码的情况下运行 DRM的形式。如果是这种情况,并且你正在寻找使用调试器来阻碍人们,我认为你很好地需要硬件加密狗或基于网络的锁。在我的头脑中,我知道SafeNet带有这样做的产品(我过去曾经接触过它们,看起来还不错),但我不知道它们与其他市场相比有多好

答案 5 :(得分:0)

如果您想要在您描述的场景中尽可能多的真实安全性,您应该要求在安装系统时“管理员”输入数据库密码和他自己的管理员密码;然后,应用程序应存储管理员密码的盐渍哈希值,并应存储使用管理员密码的不同盐渍哈希加密的数据库密码。在程序运行时,数据库密码(或足以重建它的信息)将保留在内存中,但如果没有管理员密码,即使完全了解系统,也无法在程序未运行时检索。

如果需要允许多个用户访问数据库,则“添加用户”按钮可以允许添加用户帐户。当用户键入密码时,使用它来存储散列/加密数据,与管理员一样。

任何拥有调试器的用户都可以利用他对有效用户帐户和密码的了解来掌握数据库密码,但是不了解有效帐户密码的人将无法做任何事情。

答案 6 :(得分:-1)

如果我正确地解释您的问题,那么您希望基本上将您的应用程序分发给用户,允许他们运行它,并让应用程序更新您的数据库。同时,您希望阻止该人员登录数据库并直接自行使用。

如果您的程序可以被反编译(例如java,但我不了解其他语言,如C,C ++),那么拥有您的应用程序的人将能够看到源代码。一旦有了这些,他们肯定会以某种方式发现用户名和密码。即使您的源代码使用可逆加密算法存储了密码,持有源代码的人也可以编写与您相似的代码来反转加密并发现密码。

即使您的应用程序无法反编译,用户也许能够捕获它发送到数据库的网络数据包并从中确定密码。我不知道你是否可以通过SSL与数据库通信。

相反,我认为您需要将应用程序拆分为客户端和服务器应用程序。您可以编写一个安静的Web应用程序,或使用消息传递服务(例如JMS),并编写一个使用它的客户端应用程序。

在这种情况下,您可能希望拥有或不希望拥有由服务器端应用程序管理的用户帐户。让我在这里说清楚,我不是在谈论数据库帐户,而是您的应用程序管理的帐户,其详细信息恰好存储在数据库中。如果您确实创建了用户帐户,则可以按照下面显示的原始答案中的模式进行操作。

============== Hashing Approach,我的原始答案============

正如其他人已经提到的那样,在将密码存储到数据库之前,最好在密码中添加salt并使用摘要算法。但是,我认为还需要更多细节。

使用带有salt值的SHA1或SHA2可能非常强大,但是有更强大的方法。我强烈建议您read this section of the spring security手册。我不认为您使用的是spring或java,但该部分涵盖了很好的概念。请允许我解释一下:

  1. 至少使用8字节的salt值,最多16个字节会很棒。每个帐户的盐值应该是不同的,如果它是相同的,那么饼干只需要生产一个彩虹表!它应该是随机生成的。文档没有说明这一点,但我也建议使用安全的随机数生成器,不要使用随机数种子来生成一致的数字序列。
  2. 您应该多次散列密码,因为这会导致暴力破解密码黑客尝试占用越来越多的时间。实际上,您可能需要慢速密码编码算法而不是快速密码编码算法。
  3. 将原始盐值与密码一起存储在数据库中,甚至可以将其存储在同一个字段/列中。这是必需的,以便将来可以验证密码。
  4. BCryptPasswordEncoder就是一个很好的例子。

    ===============

    可能解决或可能不解决问题的另一种方法是创建具有有限权限的数据库帐户。例如,您可以创建一个只能在数据库中的特定表上进行选择,更新,插入和删除的数据库帐户。您可能认为这不可接受,因为您可能不希望让人们直接执行这些操作,而您可能希望让应用程序执行这些操作。这取决于您的具体情况。