如何将密码安全地存储在我的服务器中?

信息安全 加密 密码 Web应用程序 密码管理 地图
2021-08-18 05:16:15

免责声明:我知道我应该使用bcrypt安全地存储用户的密码请继续阅读。

我想为每个用户存储多个电子邮件服务的凭据。因此,如果我使用我的用户名和密码(已正确散列)登录,那么我可以通过 imap 访问几封电子邮件,包括 2 个@hotmail、1 个@gmail、我的大学和其他几个。我正在使用 imap 阅读电子邮件,这需要纯文本的电子邮件和密码。那么,如何安全地存储这些密码呢?

我想到的:

  • 一些服务提供 API。尽可能使用它们。

  • 使用他们的登录密码加密每个用户的凭据,因此只有知道其登录详细信息的用户才能解密他的凭据,从而访问电子邮件。我不确定如何正确执行此操作,所以这里是我需要帮助的地方。我会使用mcrypt_encrypt()PHP 和MCRYPT_RIJNDAEL_256.

  • 每次用户登录时都请求密码。如果用户连接的服务超过 2 个,则不实用。

TL;博士

如何将密码存储在数据库中,以便以后可以将它们与 imap 一起使用?

3个回答

您面临每个密码管理器都面临的问题。我相信他们的解决方案是使用对称算法来加密敏感数据,并为每个用户使用一个主密码来为他/她保存的所有密码派生一个解密密钥。每次重新启动脚本/应用程序时,或者对于 Web 应用程序,每次用户登录时都必须输入此主密码。

这基本上就是您在第二个要点中描述的内容。您需要的加密工具是PBKDF2:发送时在用户的登录密码上使用它。生成的密钥应该适合使用MCRYPT_RIJNDAEL_256.

附带说明:确保每次加密新数据时使用不同的初始化向量!

您可能会考虑部署自己的 SSO 环境(请注意,我没有说“自己动手”)。

我个人贡献的一个是 Jasig 的中央身份验证服务 ( http://www.jasig.org/cas ),它作为一个集中的身份验证平台,供您的用户登录。然后,您的“客户端”应用程序需要与 CAS 进行“CAS 化”(集成),以便在用户已经通过此第三方软件验证的情况下授权用户访问。

关于您的问题,我贡献的组件是他们的 ClearPass 扩展(此处),它虽然增加了任何使用哈希加密的应用程序的安全风险,但允许您代理明文凭据(此处)。

目的(ClearPass):要启用单点登录到某些遗留应用程序,可能需要向它们提供实际的明文密码。虽然这种方法不可避免地增加了安全风险,但许多机构发现它是“必要的邪恶”。

成功完成 ClearPass 交易后,您将获得用户的登录名和密码。请注意,这将是用户的应用程序登录凭据;用户使用什么来登录您的应用程序,该应用程序代表他们处理对第三方电子邮件服务的身份验证

手头的登录凭据,然后您可以通过 ClearPass 一遍又一遍地重新请求他们的应用程序密码,以按需解密您最初使用他们的登录密码加密的服务密码,以解决@executifs 描述的“密码管理器”问题。用户应用程序密码的存储由 ClearPass 处理,由 EncryptedMapDecorator 加密,并存储在内存中(或 memcached 等)。

顺便说一句,这是我不久前在使用加密和 ClearPass 时写的关于加密实现的快速wiki 页面(是的,它已提交给 Freenode 上的##crypto 以进行大众批评并根据需要进行修改) 以防万一。

对于实际代码,这里有一些JavaNode.js 中的示例。,是的,甚至C#请注意,最后两个基本上是我对EncryptedMapDecorator.java基于密码的密钥派生(根据您的密码短语派生密钥)、初始化向量(安全随机字节)甚至打包的端口。在研究了我在这里汇总的资源以及这些代码示例之后,您应该有足够的知识能够将其移植到 PHP,或者至少可以开始使用 :)

希望有些帮助!

我觉得值得分享我这个问题的回答,它被标记为这个问题的副本。

我认为凭证存储最适合存储密码机密。您可以根据您的安全需要在以下选项中进行选择 -

  • 基于软件的凭证存储
  • 系统管理的凭证存储
  • 基于硬件的凭证存储

我建议您阅读此博客Cryptographic Key Storage Options & Best Practices在大多数情况下,系统管理的凭据存储是一个不错的选择。许多操作系统提供系统管理的凭证存储,例如Windows Certificate Store、Mac OS Keychain您还可以在 Android Keystore System 上查看我的答案以了解一下。根据您的平台,我可以为您提供以下存储秘密凭证的解决方案,