-
02-07-2019 - |
题
我需要存储数据库的密码配置文件。由于显而易见的原因,我要对它们进行加密(最好与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。它运行良好,非常易于使用。我实际上将它用于完全相同的事情,将密码存储在配置文本文件中。
TurboPower LockBox 3(http://lockbox.seanbdurkin.id.au/)使用自动腌制。 我建议不要使用Barton的DCPCrypt,因为IV不受盐腌。在某些情况下,这是一个非常严重的安全缺陷。
与之前的文章相反,LB3的AES实施完全符合标准。
即使您加密,在我看来,您的解密密钥和加密密码都将在您的可执行文件中,这意味着绝不仅仅是默默无闻的安全性。任何人都可以获取解密密钥和加密密码并生成原始密码。
你想要的是单向哈希。
提醒一下。
如果您不需要与其他加密库进行互操作,那么DCP或LockBox就可以完成这项工作。
BUT
如果你需要它完全符合rinjdael规范,忘记免费组件,他们´ re kinda“糟糕”"大多数时候。
正如其他人所指出的那样,出于身份验证的目的,您应该避免使用可逆加密存储密码,即您应该只存储密码哈希,并根据您存储的哈希检查用户提供的密码的哈希值。但是,这种方法有一个缺点:如果攻击者被抓住,它很容易受到彩虹表攻击你的密码存储数据库。
您应该做的是存储预先选择的(和秘密)盐值的哈希值+密码。即,连接salt和密码,散列结果,并存储此哈希。进行身份验证时,请执行相同操作 - 连接salt值和用户提供的密码hash,然后检查是否相等。这使彩虹表攻击变得不可行。
当然,如果用户通过网络发送密码(例如,如果您正在使用Web或客户端 - 服务器应用程序),那么您不应该以明文形式发送密码,因此不要存储哈希(salt +密码)你应该存储和检查哈希(salt + hash(密码)),并让你的客户端预先哈希用户提供的密码并通过网络发送密码。如果用户(尽可能多)重复使用相同的密码用于多种用途,这也可以保护用户的密码。
我建议使用某种类型的盐。不存储crypt(密码)在配置文件,但事的这个商店crypt(盐+密码)。作为"盐"你可以用的东西,需要以开放数据库,例如。,+用户名.对地穴功能可以使用一些众所周知的algortithm AES、想法、德、或一些简单的异或每个字节字节的一些其他串,这串将是您的钥匙。为了使它更不同的解决可以使用一些随机的字节,并将它们存储。
所以存储:
- init_str:=5随机的字节
- new_password:=盐+password//盐:=,+用户名
- crypted_password=xor_bytes(init_str+new_password,我的关键词')
- crypted_password:=init_str+crypted_password
- 存储crypted_password配置,因为这将是字节可以制作精美的或base64它
和连接:
- 分的数据读取config入init_str和crypted_password
- new_password=xor_bytes(init_str+crypted_password,我的关键词')
- 密码:=删除(,+用户名)从new_password
尼克当然是对的 - 当你说你想花15分钟时间实施安全解决方案时,我只是假设你知道自己在做什么。如果你决定采用那条(更好的)路线,DCPCrypt库还会实现许多哈希算法。
几个方案:
- 不存储的密码。如果 该数据库支持的综合 认证,使用它。该过程 可以设置一个特定的 的身份,并将自动 认证通过的数据库
- 使用Windows证书店和一个 证书加密的密码。如果存储的关键用于地下墓室 你的密码在你的申请, 你有很小的安全无论如何, 你要保护的关键。
这个Embarcadero的演示给出了一个简单但对大多数应用程序来说足够强大的系统: https://edn.embarcadero.com/article/28325