8

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

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

你会建议什么加密/解密算法?当您认为攻击者无法使用私钥时,加密密码是否仍与散列 (MD5/SHA1) 一样安全?

4

5 回答 5

8

我将改写 Jammer 的方法——

  1. 生成公钥/私钥对。在您的网络服务器上硬编码公钥。将私钥存储在网络服务器/数据库/任何开发人员无法触及的物理银行储物柜中。
  2. 用户注册时,使用公钥加密密码+盐。此步骤与使用哈希算法相同。将加密的密码+盐存储在数据库中。
  3. 当您要验证密码时,再次对其进行加密,并将其与存储在数据库中的值进行比较。

如果攻击者获得了数据库,他就无法解密密码,因为他没有私钥。他无法获得私钥,因为它在他无法触及的银行保险库中。由于盐,两个相同的密码仍然会以不同的方式存储在数据库中。

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

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

当然,我可能是错的。

于 2010-03-31T22:34:03.333 回答
5

不要解密密码。如果您将来需要更改密码系统,请添加一个名为 storage_type (或其他)的字段。

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

于 2010-03-31T20:35:18.707 回答
2

能够解密密码是一个坏主意(并且可能没有任何方法比不加密存储它们更好)。听起来您的主要问题是如果您更改存储方法,则无法使用密码。只需做 Linux 所做的事情,存储您如何使用密码对密码进行哈希处理。因此,例如 $1$salt$hash 是 MD5。这样,如果您决定更改密码的存储方式,您仍然可以检查旧密码(如果有人正确登录,您可以使用新哈希更新他们的密码)。

于 2010-03-31T20:28:54.330 回答
1

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

您想使用公钥直接加密密码+盐。

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

  1. 针对通用公钥/私钥加密的攻击
  2. 针对您的私钥存储的攻击。
于 2010-04-02T07:49:41.987 回答
-1

对于大多数应用程序来说,存储密码的 SHA-1 哈希已经绰绰有余了。

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

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

于 2010-03-31T20:31:47.343 回答