代码之家  ›  专栏  ›  技术社区  ›  Treb

Delphi中的密码加密

  •  17
  • Treb  · 技术社区  · 16 年前

    我需要将数据库密码存储在配置文件中。出于明显的原因,我想加密它们(最好是使用AES)。是否有人知道Delphi实现很容易引入到现有项目中,该项目具有超过10000条历史增长线(urgh!)源代码?

    说明:简单的意思是将单元添加到项目中,最多添加5行代码,在其中读取并完成配置文件。不应超过15分钟。

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

    15 回复  |  直到 7 年前
        1
  •  17
  •   Marek Jedliński    16 年前

    我赞成大卫·巴顿的建议 DCPCrypt library . 我已经在几个项目中成功地使用了它,并且在您阅读了使用示例后不会超过15分钟。它使用MIT许可证,因此您可以在商业项目或其他项目中自由使用它。dcpcrypt实现了许多算法,包括rijndael,即aes。

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

        2
  •  16
  •   Ondrej Kelle    16 年前

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

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

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

        3
  •  8
  •   Giacomo Degli Esposti    16 年前

    我认为涡轮动力密码箱是一个优秀的脚本编写库:

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

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

        4
  •  3
  •   Thomas Ahle    16 年前

    唐德瑞有正确的方法。您不应该使用可逆密码器来存储密码。正如正确指出的那样,如果您的“主”钥匙曾经被损坏,整个系统也会受到损坏。使用不可逆的哈希(如MD5)更安全,您可以将哈希值存储为明文。只需散列输入的密码,然后将其与存储的散列进行比较。

        5
  •  3
  •   Steve    16 年前

    我一直使用涡轮动力锁箱。它工作得很好,而且很容易使用。实际上,我将它用于完全相同的事情,将密码存储在配置文本文件中。

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

        6
  •  3
  •   Sean B. Durkin    14 年前

    涡轮动力锁箱3(http://lockbox.seanbdurkin.id.au/)使用自动加盐。 我建议不要用巴顿的DCPCRYPT,因为静脉注射不加盐。在某些情况下,这是一个非常严重的安全缺陷。

    与之前的通信相反,LB3的AES实现完全符合标准。

        7
  •  2
  •   cleg    16 年前

    我用过这个 library ,很快添加。但是 wiki shows 没有更多的解决方案。

        8
  •  2
  •   Bruce McGee    14 年前

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

    你想要的是单向散列。

        9
  •  1
  •   community wiki DonOctavioDelFlores    16 年前

    只是个提醒。

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

    但是

    如果你需要它完全符合林代尔的规格,忘记免费的组件,它们大多数时候都有点“糟糕”。

        10
  •  1
  •   Mihai Limbășan    16 年前

    正如其他人所指出的,为了进行身份验证,您应该避免使用可逆加密来存储密码,也就是说,您应该只存储密码散列,并对照存储的散列检查用户提供的密码的散列。然而,这种方法有一个缺点:它容易受到 rainbow table 如果攻击者持有密码存储数据库,则会发生攻击。

    您应该做的是存储一个预先选择(和秘密)的salt值+密码的散列值。也就是说,将salt和密码连接起来,散列结果,然后存储这个散列。进行身份验证时,请执行相同的操作-连接salt值和用户提供的密码hash,然后检查是否相等。这使得彩虹桌攻击不可行。

    当然,如果用户通过网络发送密码(例如,如果您正在使用Web或客户机-服务器应用程序),则不应通过明文发送密码,因此,您应该存储哈希(salt+password)并对照哈希(salt+hash(password))进行检查,而不是存储哈希(salt+password),并让您的客户机预哈希用户提供的密码。通过网络发送。如果用户(和许多用户一样)出于多种目的重复使用同一密码,这也会保护用户的密码。

        11
  •  1
  •   Michał Niklas    16 年前

    我建议用某种盐。不要将crypt(password)存储在配置文件中,而是安装此存储crypt(salt+password)。作为“salt”,您可以使用打开数据库所需的内容,例如db_name+user_name。对于crypt函数,您可以使用一些众所周知的algorithm,例如aes、idea、des,或者简单地使用其他字符串中的字节对每个字节进行异或运算,该字符串将是您的密钥。为了使求解更为不同,可以使用一些随机字节,并存储它们。

    所以存储:

    1. 初始字符串:=5个随机字节
    2. 新密码:=salt+password//salt:=db_name+user_name
    3. 加密的_password=xor_bytes(init_str+new_password,'my keyprase')
    4. 加密的_密码:=init_str+加密的_密码
    5. 将加密的密码存储在config中,因为这将是字节,您可以对其进行hexify或base64。

    并连接:

    1. 将从配置读取的数据拆分为init_str和加密的_密码
    2. new_password=xor_bytes(init_str+crypted_password,'my keyphrease')
    3. 密码:=从新密码中删除(db_name+user_name)
        12
  •  0
  •   Marek Jedliński    16 年前

    尼克当然是对的——我只是假设当你说你想花15分钟来实现一个安全解决方案时,你知道你在做什么。如果您决定采用(更好的)路径,dcpcrypt库还实现了许多散列算法。

        13
  •  0
  •   user160694    14 年前

    几个解决方案:

    • 根本不存储密码。如果 数据库支持集成 验证,使用它。过程 可以设置为使用特定的 身份,自动 由数据库验证
    • 使用Windows证书存储和 用于加密密码的证书。 如果您存储用于加密的密钥 应用程序中的密码, 不管怎样,你几乎没有安全保障, 你也必须保护钥匙。
        14
  •  0
  •   Community datashaman    7 年前

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

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

    1. 把它存储在一个 EFS encrypted file .
    2. 把它储存在 secure local storage .

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

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

    ——杰罗恩

        15
  •  0
  •   UnDiUdin    7 年前

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