【问题标题】:storing a password securely for api without encrypting it安全地为 api 存储密码而不加密它
【发布时间】:2016-10-30 11:10:23
【问题描述】:

我需要在我的 MySql 数据库中存储一个密码,以便与外部公司的 API 一起使用。

在我看来,所有密码都应该在数据库中进行哈希处理,以防网站被黑客入侵并且信息泄露到互联网上。但是,如果我对密码进行哈希处理,如何将它们与需要电子邮件地址和密码才能访问的 API 一起使用?

我网站的用户密码经过哈希处理,这是我正在努力使用的 API 的密码。

我想要一个相对简单的解释如何处理这个问题,我已经阅读了一些与我的问题相似但没有找到答案的帖子。我可以加密密码。

提前致谢。

【问题讨论】:

  • 您必须将密码存储在您的数据库中吗?你能不能把它保存在你的应用程序的配置文件中,就像你可能对你的数据库连接细节做的那样?
  • 我还会检查 API 是否提供替代身份验证方法,即通过生成一个您可以使用的密钥。然后,您可以在他们的网站上使用用户/通过身份验证来生成/轮换密钥。

标签: php mysql encryption


【解决方案1】:

使用您不存储的用户密码加密密码。这样密码永远不会被存储,只是在使用时暂时存储在 RAM 中。

  1. 在创建用户时使用password_hash 保存用户的哈希密码。

  2. 当用户需要保存第 3 方密码以供以后使用时,使用 password_verify 验证用户身份,然后使用用户密码加密第 3 方密码并保存。请注意,服务器不会存储加密的第 3 方密码的密钥。

  3. 当用户想登录第三者网站时,他输入密码,通过password_verify验证他的散列密码,第三者密码用他的密码解密并发送给第三者。

注意事项:

一个。用户的密码不直接作为加密密钥,加密函数使用密钥派生函数如PBKDF2来生成实际的加密密钥。

b. password_hash和加密密钥推导函数都必须有很高的工作因子,一般在100ms左右。

另一个值得探索的途径是密码管理器使用的加密方案,或者找到您可以使用的开源密码管理器实现——确保它经过严格审查。

【讨论】:

  • 使用时需要注意的重要一点是,如果用户忘记了密码,加密数据也会消失。如果用户更改密码,则需要使用旧密码加密数据并使用新密码重新加密。
  • 是的,根据定义,安全性是一种 PITA。关键是,如果服务器拥有加密密钥,攻击者将拥有该密钥,并且不仅拥有该站点的用户密码,还拥有其他几个站点的密码。
  • 不确定它是不是真正的皮塔饼。只是要记住的事情。
  • 密码对我来说是一个 PITA,而 2 因素身份验证更是如此。每次某个网站让我创建密码时,我都会陷入“不是另一个登录名/密码”的咆哮!
  • 不行,试着详细解释一下: 1. 相同的密码是如何造成漏洞的。 2. 如何使用彩虹桌。考虑用户密码通过 PBKDF2 运行 100 毫秒的迭代持续时间。 3.每个密码加密都有不同的随机IV。
【解决方案2】:

我怀疑您的用户密码是加密的(至少我希望不是),因为这意味着它们可以被解密(这是不好的安全做法)。用户密码通常以单向方式散列(例如使用password_hash

但是,使用您的 API 密码,您就有了以双向方式加密而不是散列它的真实案例。在这种情况下,PHP 会为您提供 openssl_encryptopenssl_decrypt 函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-07-04
    • 2017-03-23
    • 2012-05-23
    • 2015-07-21
    相关资源
    最近更新 更多