我需要将数据库密码存储在配置文件中。出于明显的原因,我想要加密它们(最好使用AES加密)。有没有人知道一个Delphi实现,可以轻松地引入到现有项目中,该项目具有超过10,000行历史代码(URGH!)?
澄清一下:易用性意味着将单元添加到项目中,在读取配置文件的地方添加最多5行代码,然后就完成了。不应花费超过15分钟。
另一个澄清:需要密码以便创建与数据库的连接,而不是为应用程序支持用户管理方案。所以使用哈希函数无济于事。数据库引擎检查密码是否有效,而不是应用程序。
我需要将数据库密码存储在配置文件中。出于明显的原因,我想要加密它们(最好使用AES加密)。有没有人知道一个Delphi实现,可以轻松地引入到现有项目中,该项目具有超过10,000行历史代码(URGH!)?
澄清一下:易用性意味着将单元添加到项目中,在读取配置文件的地方添加最多5行代码,然后就完成了。不应花费超过15分钟。
另一个澄清:需要密码以便创建与数据库的连接,而不是为应用程序支持用户管理方案。所以使用哈希函数无济于事。数据库引擎检查密码是否有效,而不是应用程序。
我赞同使用David Barton的DCPCrypt库的建议。 我已经在几个项目中成功使用它,而且只需要阅读使用示例,就不会花费超过15分钟。 它使用MIT许可证,因此您可以在商业项目和其他情况下自由使用它。 DCPCrypt实现了许多算法,包括Rijndael,即AES。
也有很多单元独立实现可以通过谷歌搜索到 - 问题在于你信任哪一个,除非你准备验证特定库的正确性。
对于典型的身份验证目的,您无需存储密码,只需检查用户输入的密码是否正确。如果是这种情况,那么您只需要存储哈希签名(例如MD5),然后将其与输入密码的签名进行比较。如果两个签名匹配,则输入的密码正确。
存储加密密码可能会很危险,因为如果有人获得您的“主”密码,则可以检索所有用户的密码。
如果您决定使用MD5,您可以使用Delphi自带的MessageDigest_5.pas(至少它包括在我的Delphi 2007副本中)。还有其他Delphi源代码实现可供选择。
TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) 使用自动加盐。
我不建议使用Barton的DCPCrypt,因为它的IV没有被加盐。在某些情况下,这是一个非常严重的安全漏洞。
与早期评论相反,LB3对AES的实现完全符合标准。
TOndrej的方法是正确的。您永远不应该使用可逆密码来存储密码。正如正确指出的那样,如果您的“主”密钥被攻破,整个系统都会受到影响。使用不可逆哈希,例如MD5,更加安全,您可以将哈希值存储为明文。只需对输入的密码进行哈希,然后将其与存储的哈希进行比较即可。
提醒一下。
如果您不需要与其他加密库进行交互,那么DCP或LockBox就可以胜任。
但是
如果您需要完全符合rinjdael规范,那么请忘记免费组件,它们大多数时候都很“糟糕”。
正如其他人所指出的那样,为了身份验证目的,您应该避免使用可逆加密存储密码,即只应存储密码哈希值并检查用户提供的密码哈希与您存储的哈希是否相同。然而,这种方法有一个缺点:如果攻击者获取到您的密码存储数据库,它容易受到彩虹表攻击。
您应该做的是存储预先选择(和保密的)盐值+密码的哈希值。也就是说,将盐和密码连接起来,对结果进行哈希处理,然后存储此哈希值。在进行身份验证时,执行相同的操作-连接您的盐值和用户提供的密码,哈希,然后检查是否相等。这使得彩虹表攻击变得不可行。
当然,如果用户通过网络发送密码(例如,如果您正在开发Web或客户端服务器应用程序),则不应该以明文形式发送密码,因此,您应该存储并检查hash(salt + hash(password)),并让客户端对用户提供的密码进行预哈希处理,然后将其发送到网络上。这也保护了您的用户密码,因为许多用户会重复使用相同的密码。