如何正确进行私钥管理
Posted
技术标签:
【中文标题】如何正确进行私钥管理【英文标题】:How to properly do private key management 【发布时间】:2010-12-07 16:48:48 【问题描述】:对于实施符合PCI DSS 安全标准的密钥管理方案的方案,是否有人获得过实践经验或参考?
考虑到符合 PCI DSS 的公司数量,显然有不少实施方案,但试图找到它们的详细信息却很困难。当涉及到存储私有数据时,讨论通常会停留在使用哪种加密算法上。之后通常会有关于适当存储私钥的声明,但没有讨论实际的方法或定期更改密钥或向应用程序提供密钥等事情。
具体来说,我对 PCI DSS 标准第 3.5 和 3.6 节中的要求感兴趣。
3.5.2 将加密密钥安全地存储在尽可能少的位置和表格中。
3.6.a 验证是否存在用于加密持卡人数据的密钥的密钥管理程序。注意:包括 NIST 在内的各种资源都提供了许多用于密钥管理的行业标准,可在 http://csrc.nist.gov 找到。
3.6.4 验证密钥管理程序是否已实施,要求至少每年定期更换密钥。
我看过NIST Cryptographic publications,正如 PCI DSS 要求文档所建议的那样,但除了最近的 Cryptographic Key Management Workshop 注释之外,似乎没有太多真正可实施的方案或标准。
至于我想要做的不是:
-
将密码 + 盐存储为身份验证的一种方式,
为数据加密选择一个强大的对称算法,
首先避免需要存储私有数据。
避免使用其他机制进行密钥管理:物理安全、数据库安全、龙和巫师等。
所有这些都是有效的问题,但在这种情况下不是答案。我的要求的具体细节在另一个 SO 问题 .Net Design pattern for storing and retrieving sensitive per user data 中,但这一切都归结为密钥管理,因此这个问题更加精致。
【问题讨论】:
很想知道你最终做了什么?我一直在搜索,但找不到 NIST SP 800-22 的有效密钥或示例代码。我的 webapp 在 php 中,即使是商业实现也会有所帮助。 我最终不需要存储持卡人数据,但仍然需要一定程度的应用程序加密。对于 Windows,我使用存储在 Windows 证书存储中的证书和 RSA 密钥作为存储在配置文件中的加密应用程序密钥的主密钥。对于某些 Linux mysql 数据库,我使用了 LUKS,其中文件系统只能在手动输入密码后才能挂载。 【参考方案1】:我很熟悉你正在经历的痛苦。我们努力更新旧的 EFT 系统以实现 PCI 合规性。密钥管理无疑是(从我的软件角度来看)最具挑战性的部分。
我想我也偶然发现了 Martin 发布的 NIST Recommendations for Key Management,并且对缺乏具体示例感到非常沮丧。
ANSI X9.17 - Financial Institution Key Management 可能与您的需求最相关,使用 PCI-DSS。不过祝你好运,该文档是大量 TLA 的集合,我知道我确实很难阅读。 (X9.17每年更新,现在最新版本是:NIST SP 800-57 Pt. 1 Rev. 4)
当沮丧变成绝望时,我偶然发现了The Electronic Money Mill,这是一个虚构的故事,有大量相关的技术参考资料。 Chapter 17 讨论 X9.17,可能有助于理解。
根据所有这些参考资料,我设计了一个让我们的审计师满意的关键管理系统。设计文档相当长,但总而言之,您的想法是您的数据加密密钥受密钥加密密钥保护,并且密钥加密密钥存储在物理上独立的盒子上,它本身受主密钥保护。
我的实现是让密钥服务器应用程序在 Windows 机器上运行。此应用程序需要输入两个单独的“密钥服务器主密钥”才能使用。这些密钥只有密钥服务器管理员知道。这些密钥被异或在一起以生成主密钥,该主密钥仅在应用程序运行时存储在受保护的内存中。然后,应用程序可以自动生成加密强度高的密钥加密密钥,这些密钥使用主密钥以加密形式存储。
需要加密的应用程序将向密钥服务器请求密钥加密密钥。应用程序使用 KEK 来加密/解密数据加密密钥,该密钥可以与应用程序数据一起安全地存储。
祝你好运。我希望你也觉得这是一个有趣的挑战!
【讨论】:
幸运的是,我不必实施 PCI DSS 标准,这只是我的问题中的一个示例,以便我可以通过强大的密钥管理方案获得答案。诀窍似乎是如何将密钥加密密钥放入应用程序。我不想为它使用单独的服务器,所以我正在考虑让应用程序为其生成提示,或者能够通过 ssh 连接到应用程序来设置它。 听起来不错。仅当您想保留 KEK 时才需要单独的框,并且旨在防止有人复制整个应用程序 + 数据的情况(例如从字面上离开该框) 电子货币工厂不再出现在原始链接中。 FWIW,我在 Wayback Machine 中找到了它的 PDF 副本:web.archive.org/web/20070712172633/http://www.msen.com/fievel/… " 将从密钥服务器请求密钥加密密钥。"您能否详细说明服务器如何安全地向客户端发送密钥?用户是否还将从服务器接收到的密钥保存在 RAM 中? @Paul - 我正在复活这个您在 10 多年前回答的古老且非常有价值的帖子。 AWS KMS(亚马逊密钥管理系统)和 GCP KMS(谷歌云密钥管理系统)的出现是否有助于我们安全地存储 KEK(密钥管理密钥)?似乎两者都需要凭据来检索 KEK,这是我的应用程序必须存储在某处的凭据。例如,默认情况下,AWS 将其“aws_secret_access_key”值存储在 ~/.aws/credentials 本地文件中。但是,既然 aws_secret_access_key 被存储为纯文本,那有什么意义呢?访问密钥 -> KEK -> DEK :\【参考方案2】:您看过 NIST SP 800-57,密钥管理建议吗?
【讨论】:
很好的链接,谢谢,这就是我所追求的参考标准。现在我在哪里可以找到关键部分如何实现的示例... @sipwiz:我不知道。我的猜测是有人会以高价卖给你这些关键部件;你可能会问 NIST 是否有一份可以这样做的公司名单。 我一直在搜索此内容,但找不到 NIST SP 800-22 的有效密钥或示例代码。我的 webapp 在 php 中,即使是商业实现也会有所帮助。以上是关于如何正确进行私钥管理的主要内容,如果未能解决你的问题,请参考以下文章