security - 如何存储用于在不同平台上进行身份验证的密码?
问题描述
我有不同平台的登录名(例如 facebook 凭据),我想安全地存储在数据库中。我希望能够使用 API 通过应用程序(自动)登录到这些平台。
有没有一种安全的方法来存储这些登录信息而不会丢失它们(不能散列它们)。
谢谢
解决方案
您的应用程序为第三方存储凭据可能风险太大。如果我是您的目标用户,我当然不会相信某个平台以平台本身可能可以访问的方式将我的凭据存储到 facebook 和其他人。
假设您评估并接受了这种风险,并且您的用户会出于某种原因信任您。您需要承认的一件事是,如果您的平台遭到入侵,则存储的所有凭据都将受到破坏,但您可以限制此类破坏的影响,这就是您应该做的。
您应该使用硬件安全模块。现在这在传统上非常昂贵和复杂,但您现在可以将 HSM 用作云服务。所有主要的云平台都有 CloudHSM 解决方案,以及基于 HSM 本身的更高级别的服务。
HSM 的要点是永远不会释放存储的密钥。您在 HSM 中生成密钥对,无法提取私钥。对于加密操作(如加密、解密),您将数据发送到 HSM,它会为您执行此操作,而您无需知道密钥。关键是即使存在妥协,影响也是有限的,因为攻击者的访问是有时间限制的,而且你可以对 HSM 本身应用适当的审计和访问控制。
但是 HSM 不存储网站凭据,它存储密钥对。因此,您可以使用 Amazon Secrets Manager 之类的工具(或者您可以自己构建,但这真的很棘手),它本身基于 AWS KMS,并使用安全存储在 HSM 中的密钥加密您的密钥。
所以你会
- 创建一个 KMS 密钥,如果您有大客户,那么可能每个客户一个 KMS 密钥(或者如果是公司,他们可能可以提供自己的 KMS 密钥,请参阅自带密钥,BYOK)
- 使用秘密管理器存储秘密,最好用您的客户特定密钥加密
- 使用允许其访问 Secrets Manager 中的密钥的 IAM 角色在 AWS 中运行您的应用程序
请注意,也可以在没有 AWS 或任何其他云提供商的情况下设置类似的架构,但它要复杂得多。
这为您提供的是
- 可审计性(谁使用了哪个密钥/秘密/凭证,以及何时使用)
- 撤销访问的可能性
- 对您的凭证存储的限时访问,即使对于确实破坏了您的整个应用程序的攻击者也是如此
- 让您的用户知道是否存在妥协的选项,在这种情况下,他们将需要更改下游服务中的凭据
- 如上所述的 BYOK
请注意,这是一个相当复杂的事情,要实现和正确处理,而且运营成本也不容忽视。您将需要流程和技术控制来减轻许多其他风险。这只是对您实际上可以采取哪些措施来保护这些秘密的简要介绍。
推荐阅读
- java - 如何在 G1GC 中触发老年代的收集
- regex - 正则表达式用于匹配字符串后的字符串到逗号
- python - 尽管其他数据库连接正常,但从 Python 连接时出现“数据库不存在”错误
- python - 使用字典查找和替换 CSV 文件中特定列中的值
- ios - 应用程序在后台时未调用 didReceive 和 willPresent
- javascript - 为每个表预填充选择数据的逻辑
- angular - 带有守卫的路由在服务器端渲染中不起作用
- postgresql - 处理来自 kinesis 的事件时出现奇怪的问题
- java - 实时数据和房间查询
- php - 如何修复“数组(...)与预期类型“NULL”不匹配的错误。”?