我需要存储数据库的密码配置文件。由于显而易见的原因,我要对它们进行加密(最好与AES)。没有人知道有德尔斐执行情况,易于引入一个现有项目与>10,000线的历史增长(呃!) 源代码?

澄清:简单意味着增加该股的项目,增加最大。5行代码在哪里配置文件的读取以及可以用它做。不应超过15分钟。

另一个澄清:密码是必要的,以便创建一个连接的数据库,不要支持一个用户管理方案的应用程序。所以使用哈希没有帮助。该数据库引擎检查,如果密码是有效的,不应用程序。

有帮助吗?

解决方案

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

还有许多googlable独立(单一单元)实现 - 问题是您信任哪一个,除非您准备自己验证特定库的更正。

其他提示

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

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

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

我认为Turbopower LockBox是一个优秀的密码学库:

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

我不知道它是否对你的用途来说太大了,但它很容易使用,你可以用5行代码加密一个字符串。一切都在这些例子中。

TOndrej有正确的方法。您永远不应该使用可逆密码存储密码。正确地指出,如果你的“主人”是密钥遭到破坏,整个系统都受到了损害。使用不可逆的哈希值(如MD5)更安全,您可以将哈希值存储为明文。只需对输入的密码进行哈希处理,然后将其与存储的哈希值进行比较。

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

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

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

与之前的文章相反,LB3的AES实施完全符合标准。

我已经使用了这个,非常快速地添加。但 wiki显示更多解决方案。

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

你想要的是单向哈希。

提醒一下。

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

BUT

如果你需要它完全符合rinjdael规范,忘记免费组件,他们´ re kinda“糟糕”"大多数时候。

正如其他人所指出的那样,出于身份验证的目的,您应该避免使用可逆加密存储密码,即您应该只存储密码哈希,并根据您存储的哈希检查用户提供的密码的哈希值。但是,这种方法有一个缺点:如果攻击者被抓住,它很容易受到彩虹表攻击你的密码存储数据库。

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

当然,如果用户通过网络发送密码(例如,如果您正在使用Web或客户端 - 服务器应用程序),那么您不应该以明文形式发送密码,因此不要存储哈希(salt +密码)你应该存储和检查哈希(salt + hash(密码)),并让你的客户端预先哈希用户提供的密码并通过网络发送密码。如果用户(尽可能多)重复使用相同的密码用于多种用途,这也可以保护用户的密码。

我建议使用某种类型的盐。不存储crypt(密码)在配置文件,但事的这个商店crypt(盐+密码)。作为"盐"你可以用的东西,需要以开放数据库,例如。,+用户名.对地穴功能可以使用一些众所周知的algortithm AES、想法、德、或一些简单的异或每个字节字节的一些其他串,这串将是您的钥匙。为了使它更不同的解决可以使用一些随机的字节,并将它们存储。

所以存储:

  1. init_str:=5随机的字节
  2. new_password:=盐+password//盐:=,+用户名
  3. crypted_password=xor_bytes(init_str+new_password,我的关键词')
  4. crypted_password:=init_str+crypted_password
  5. 存储crypted_password配置,因为这将是字节可以制作精美的或base64它

和连接:

  1. 分的数据读取config入init_str和crypted_password
  2. new_password=xor_bytes(init_str+crypted_password,我的关键词')
  3. 密码:=删除(,+用户名)从new_password

尼克当然是对的 - 当你说你想花15分钟时间实施安全解决方案时,我只是假设你知道自己在做什么。如果你决定采用那条(更好的)路线,DCPCrypt库还会实现许多哈希算法。

几个方案:

  • 不存储的密码。如果 该数据库支持的综合 认证,使用它。该过程 可以设置一个特定的 的身份,并将自动 认证通过的数据库
  • 使用Windows证书店和一个 证书加密的密码。如果存储的关键用于地下墓室 你的密码在你的申请, 你有很小的安全无论如何, 你要保护的关键。

您需要将其存储在只有当前用户才能访问的地方。

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

  1. 将其存储在 EFS加密文件中。
  2. 将其存储在安全本地存储中
  3. Internet Explorer使用2.但是如果您可以获得本地访问权限,则可以解密1.和2.如果您拥有正确的主密钥和算法(例如, iepv 可以获取Internet Explorer密码。)

    所以:结果 如果可以,请避免存储密码 首先寻找替代方案(如Windows身份验证,目录服务等)。

    - 的Jeroen

这个Embarcadero的演示给出了一个简单但对大多数应用程序来说足够强大的系统: https://edn.embarcadero.com/article/28325

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top