在 PHP 会话中存储密码是否安全?

信息安全 加密 密码 会话管理
2021-08-25 19:35:01

我需要在我的网站的私有区域中进行一些加密,并且我想要bcrypt用户的密码。

用户登录时将密码存储在会话中是否安全,以便我以后可以使用?

2个回答

不要将密码存储在会话变量中。相反,请使用代理键。

例如:

  1. 生成随机密钥。这是您的代理键。
  2. 使用该密钥加密您需要的任何数据。
  3. 使用适当的密钥派生函数(例如 PBKDF2 或 bcrypt)从您的密码生成存储密钥。
  4. 使用存储密钥加密代理密钥。如果两个密钥的长度相等,则两者的按位异或是一种理想的加密形式,因为它很简单,并且在不知道其中一个密钥的情况下无法破解。
  5. 存储加密的代理密钥。

当用户登录时,您执行以下操作:

  1. 根据密码计算存储密钥。
  2. 使用存储密钥解密加密的代理密钥。
  3. 将解密的代理密钥存储在会话变量中。
  4. 根据需要使用代理密钥解密数据。
  5. 会话结束时销毁解密的代理密钥。

如果攻击者获得对存储在您/tmp目录中的会话数据的读取权限,他们可能会提取代理密钥。但是,他们将无法获取用户的密码。虽然这不能保护您在服务器上加密的数据,但它确实可以防止未经授权访问用户的帐户,并阻止攻击者利用用户在其他地方使用相同密码的情况。

如果你想安全地使用 PHP,你应该安装Suoshin Hardened PHP 补丁(任何值得处理的托管公司都已经在他们的服务器上安装了它)。此补丁包含自动加密会话数据的功能,足以保护您免受某些类型的攻击。

但是会话黑客只是黑客工具箱中的一项,而密码是主要目标,因此它们不应被视为您的程序应该在任何时间(即使在内存中)挂起的东西;输入后应尽快对密码进行哈希处理,并立即清除密码字符串本身。

因此,我对您的问题的回答是否定的,您不应该考虑保留密码以供以后重复使用。