Delphi中的密码加密

问题描述:

我需要将数据库密码存储在配置文件中。出于显而易见的原因,我想对它们进行加密(最好使用AES)。有没有人知道一个Delphi实现很容易引入到具有10,000行历史增长(URGH!)源代码的现有项目中?澄清:简单意味着将单位添加到项目中,添加最大值。 5行代码,其中配置文件被读取并完成它。不应超过15分钟。Delphi中的密码加密

另一个解释:需要密码才能创建到数据库的连接,而不是支持应用程序的用户管理方案。所以使用散列并没有帮助。数据库引擎检查密码是否有效,而不是应用程序。

+0

哪个数据库?有更好的办法现在比使用普通的连接,旧的用户名/密码对 – 2010-10-13 07:15:45

+0

如果您使用的是Windows,那么你可以检查此文章: [存储密码的Windows安全的方式] [1] [ 1]:http://*.com/questions/13145112/secure-way-to-store-password-in-windows – wittrup 2013-09-12 00:33:01

我第二次推荐David Barton的DCPCrypt library。我已经在几个项目中成功地使用了它,并且在阅读使用示例后不会超过15分钟。它使用MIT许可证,因此您可以在商业项目中免费使用它。 DCPCrypt实现了许多算法,包括Rijndael,它是AES。

也有许多可单机使用的单一实现 - 问题是您信任哪一个,除非您准备亲自验证特定库的正确性。

+3

DCPCrypt很棒。我在很多地方使用它。 – gabr 2008-09-25 14:10:16

+1

对于什么是值得的(在这样一个旧线程中),我只是安装了DCPcrypt并且工作得很好。 – dpant 2012-01-31 16:04:00

我已经使用这个library,真的快速添加。但wiki shows几个更多的解决方案。

即使您加密,在我看来,您的解密密钥以及加密的密码都将在您的可执行文件中,这意味着绝不仅仅是安全性。任何人都可以获取解密密钥和加密密码并生成原始密码。

你想要的是单向散列。

+0

单向散列是理想的,但没有办法解密它再次使用它。这听起来像他需要读取密码,以便他的应用程序可以连接到数据库。只有当你想验证你得到了你之前存储的相同密码时,哈希才能工作。 – 2008-09-25 16:09:14

+0

哈希不是一个选项,我需要密码才能建立与数据库的连接。我无法控制分贝。 – Treb 2008-11-05 07:56:43

+0

但尼克是正确的。如果您将密钥存储在您的应用程序中,那么您只是使解密密码变得非常困难。您还需要保护密钥。 – 2010-10-13 07:14:13

尼克当然是对的 - 我只是假设你知道你在做什么,当你说你想花15分钟完成一个安全解决方案。 DCPCrypt库也实现了一些哈希算法,如果你决定去(更好的)路线。

我觉得TurboPower公司的Lockbox是criptography个很好的书房:

http://sourceforge.net/projects/tplockbox/

我不知道这是否是太大的用途,但它是非常容易使用,你可以加密一个字符串5行代码。这些都是例子。

+0

它已经老了,没有受伤。它不支持一些必要的改进(即分组密码,更大的密钥)。有努力更新它,但现在不是图书馆使用。 – 2010-10-13 07:05:54

对于典型的身份验证目的,您不需要存储密码,只需检查用户输入的密码是否正确。如果这是您的情况,那么您可以存储散列签名(例如MD5),并将其与输入的密码的签名进行比较。如果两个签名匹配输入的密码是正确的。

存储加密密码可能是危险的,因为如果有人获得您的“主”密码,他们可以检索所有用户的密码。

如果您决定使用MD5,您可以使用Delphi附带的MessageDigest_5.pas(至少它包含在我的Delphi 2007副本中)。还有其他可以选择的Delphi源代码的实现。

TOndrej有正确的方法。你不应该使用可逆密码来存储密码。正如指出的那样,如果你的“主”钥匙被破坏,整个系统就会受到影响。使用不可逆的哈希,如MD5,是更安全的,你可以存储散列值以明文形式。只需输入输入的密码即可,然后将其与存储的散列进行比较。

只是一个提醒。

如果您不需要与其他crypt库进行互操作,那么DCP或LockBox就可以完成这项工作。

,如果你需要它与rinjdael规范完全兼容,忘了免费组件,当当有点儿“糟糕”的大部分时间。

我一直用户Turbopower Lockbox。它运行良好,并且非常易于使用。我实际上将它用于完全相同的事情,将密码存储在配置文本文件中。

http://sourceforge.net/projects/tplockbox/

正如其他人所指出的那样,你应该避免使用可逆加密存储的密码认证的目的,也就是说,你应该只存储密码散列,并检查用户提供的密码的哈希值对哈希你已存储。但是,这种方法有一个缺点:如果攻击者得到密码存储数据库,就容易受到rainbow table攻击。

你应该做的是存储一个预选(和秘密)salt值+密码的散列。即,连接盐和密码,对结果进行散列,并存储这个散列。在进行身份验证时,执行相同的操作 - 连接salt值和用户提供的密码,散列,然后检查是否相等。这使彩虹表攻击不可行。

当然,如果用户通过网络发送密码(例如,如果您正在使用网络或客户端 - 服务器应用程序),则不应以明文形式发送密码,散列(盐+密码)您应该存储并检查散列(salt + hash(密码)),并让您的客户端预先散列用户提供的密码并通过网络发送该密码。如果用户(多数用户)为了多种目的重复使用相同的密码,这也会保护用户的密码。

我建议使用某种类型的盐。不要将crypt(密码)存储在配置文件中,而是放在这个存储crypt(salt + password)中。作为'盐'你可以使用打开数据库所需的东西,例如。 DB_NAME + USER_NAME。对于crypt函数,您可以使用一些众所周知的算法作为AES,Idea,DES或其他简单的操作,即将每个字节与其他字符串中的字节进行匹配,该字符串将是您的密钥。为了使它更加不同于解决,你可以使用一些随机字节,并将它们存储起来。

所以存储:

  1. init_str:= 5随机字节
  2. NEW_PASSWORD:=盐+密码//盐:= DB_NAME + USER_NAME
  3. crypted_pa​​ssword = xor_bytes(init_str + NEW_PASSWORD,“我的关键短语')
  4. crypted_pa​​ssword:= init_str + crypted_pa​​ssword
  5. 商店crypted_pa​​ssword在配置,因为这将是可以hexify字节或BASE64它

并连接:从配置读

  1. 分割数据到init_str和crypted_pa​​ssword
  2. NEW_PASSWORD = xor_bytes(init_str + crypted_pa​​ssword, '我的关键短语')
  3. 密码:=删除(DB_NAME + user_name)from new_password

TurboPower LockBox 3(http://lockbox.seanbdurkin.id.au/)使用自动盐析。 我建议不要使用Barton的DCPCrypt,因为IV没有被盐渍。在某些情况下,这是一个非常严重的安全缺陷。

与早期的提交相反,LB3的AES实现完全符合标准。

一对夫妇的解决方案:

  • 不要将密码存储在所有。如果 数据库支持集成 身份验证,请使用它。 可以设置为与特定 身份运行,并通过数据库自动 认证
  • 使用Windows证书存储的过程和 证书加密密码。 如果您存储密钥用于密码 您的密码在您的应用程序中, 您无论如何都有非常小的安全性, 您也必须保护密钥。

您需要将它存储在只有当前用户也有访问的地方。

基本上有两种方法可以做到这一点:

  1. 储存于一个EFS encrypted file
  2. 将其存放在secure local storage中。

Internet Explorer使用2.但是,如果您可以获得本地访问,则可以解密1.和2.如果您拥有正确的主密钥和算法(例如,iepv可以获取Internet Explorer密码) 。

因此:
如果可以,请避免存储密码。
首先寻找替代品(如Windows认证,目录服务等)。

--jeroen

简单,但对于大多数应用程序足够强大的系统是由该Embarcadero公司的演示给出: https://edn.embarcadero.com/article/28325