关于php:存储可解密密码的安全方法

Safe way to store decryptable passwords

我正在用PHP开发一个应用程序,有一个要求是必须能够解密密码,以避免将来将用户数据库切换到不同系统时出现问题。考虑到不可能修改未来系统的密码方法,我需要纯文本密码才能生成密码。

计划是用存储在服务器上的公钥加密用户的密码。身份验证是通过加密输入并比较结果来完成的。没有解密完成。能够解密的私钥存储在非现场供以后使用。

您建议使用什么加密/解密算法?当您认为私钥对攻击者不可用时,加密的密码是否仍然像哈希(MD5/SHA1)一样安全?


我重新表述干扰器的方法-

  • 生成公钥/私钥对。硬编码Web服务器上的公钥。将私钥存储在物理银行储物柜中,不在webserver/database/any developer可访问的范围内。
  • 当用户注册时,使用公钥加密密码+salt。此步骤与使用哈希算法相同。将加密的密码+salt存储在数据库中。
  • 当您想要验证密码时,再次对其进行加密,并将其与数据库中存储的值进行比较。
  • 如果攻击者获得了数据库,他就不能解密密码,因为他没有私钥。他拿不到那把私人钥匙,因为它在他够不到的银行金库里。由于salt的存在,两个相同的密码在数据库中的存储方式仍然不同。

    我不建议使用上述方法,因为将来任何时候都可能有人滥用私钥并访问所有密码。

    但是,如果您保证私钥始终保持私有,那么我看不到技术缺陷。

    当然,我可能是错的。


    不要解密密码。如果以后需要更改密码系统,请添加一个名为"存储类型"(或其他类型)的字段。

    然后,当您需要更改密码时,您将检查它是否是旧密码。如果是,下次他们登录时,您可以更改密码编码。否则,使用新系统登录。


    能够解密密码是一个坏主意(而且可能没有任何方法可以比不加密地存储密码更好)。听起来你的主要问题是,如果你改变了你的存储方法,你就可以使用密码。只需做Linux所做的,存储如何用密码散列密码。例如$1$salt$hash就是MD5。这样,如果您决定更改密码的存储方式,您仍然可以检查旧密码(如果有人正确登录,您可以使用新的哈希更新他们的密码)。


    我看到的唯一问题是,大多数公钥-私钥加密代码将使用公钥加密对称密钥,并依赖于私钥解密,然后使用对称密钥加密消息。

    您希望使用公钥直接加密密码+salt。

    因此,对系统的攻击归结为:

  • 针对普通公钥/私钥加密的攻击
  • 攻击您的私人密钥存储。

  • 对于大多数应用程序来说,存储sha-1散列密码已经足够了。

    是的,在大多数散列算法中都存在已知的冲突,但这并不意味着实际的攻击向量。尤其是当你在加盐时。

    对于salt:将其存储在一个配置文件中,该文件不能从外部访问,但可以由PHP安装读取。