【问题标题】:Secure password store and recovery安全密码存储和恢复
【发布时间】:2012-07-24 21:39:57
【问题描述】:

所以,

我有一个存储密码的 mysql 表,这些密码不能被散列,因为我需要稍后将其恢复为纯文本。

我有一个 javascript,它通过 ajax/php 从 mysql 数据库中获取这些密码,并将其发送到另一台服务器,该服务器将使用它进行身份验证,这就是为什么我在发送时需要以纯文本形式提供它们。

我知道有 base64 和其他加密算法,但这是不安全的。

我找到的最佳解决方案是 OpenSSL,但我不确定我是否走在正确的道路上。我是吗?

【问题讨论】:

  • 另一种选择:不要依赖客户端发送明文密码 - 让第一个服务器向第二个服务器发起请求。
  • 为什么不能散列?通常密码系统对密码进行哈希处理,然后使用输入的文本(通常是密码)对其进行哈希处理并检查哈希值是否相互匹配。
  • 它们不能被散列,因为他需要它们向另一台服务器(可能是第 3 方服务)进行身份验证。想想在线即时消息客户端,它们必须为用户的 IM 客户端存储密码,这样当用户登录时,他们就可以将他们登录到各自的消息服务中。
  • 密码存储的双向加密是邪恶的。但是,请检查:stackoverflow.com/questions/1391132/two-way-encryption-in-php

标签: php ajax encryption hash openssl


【解决方案1】:

OpenSSL 是一个很好的起点。它支持大量可用于加密纯文本密码的安全加密算法。 AES-256 或 Twofish 是很好的算法。 3DES 也被认为足以满足当今的标准。

为了提高安全性,您需要使用不同的密钥加密每个用户的密码;也就是说,每个用户都有一个唯一的加密密钥,并且您不会对所有密码使用 1 个密钥。这可能是他们在您的网站上使用的用户密码的哈希值,但通常用户密码不强,如果他们忘记了您网站/服务的密码,那么他们也会失去加密键。

为了获得最大的安全性,您不应将加密密钥存储在任何地方。当用户使用他们的密码登录时,您可以根据他们的密码在内存中生成加密密钥。理想情况下,它不仅仅是密码的哈希值,而是通过某种转换算法应用的密码。

如果这不是一个选项,那么您应该将加密密钥存储在与存储加密用户密码的物理服务器不同的物理服务器上。存储加密密钥的服务器应该具有许多安全和访问控制功能,并且数据库访问受到严格控制,因此几乎只有您的应用程序可以访问密钥。

除此之外,您必须在隐私政策中披露您可以存储加密形式的密码以用于 3rd 方服务。

希望对您有所帮助。 OWASP 可能有一些其他有用的信息与您将要做什么有关。

【讨论】:

    【解决方案2】:

    感谢所有答案,我将使用此处描述的 php 加密方法:https://stackoverflow.com/a/6639179/1415262

    并尝试一些 openssl。

    对于所有其他答案,我对它们有一些问题,并且很短的时间来解释原因。

    PS.:我还不能投票,但特别感谢 @drew010 和 @fabio :)

    【讨论】:

      【解决方案3】:

      我强烈建议您不要以明文形式存储密码,并且可能会生成某种一次性使用密钥,从一台服务器传递到另一台服务器。

      所以服务器 1 有一个链接到特定用户的唯一密钥,该密钥也在服务器 2 上,这就是传递的密钥。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 2017-12-16
        相关资源
        最近更新 更多