PCI 加密密钥管理

信息安全 密码学 密钥管理 遵守 pci-dss
2021-08-16 12:54:54

(完全披露:我已经是这里和 StackOverflow 的积极参与者,但出于希望显而易见的原因,我选择匿名提出这个特定问题)。

我目前在一家小型软件商店工作,该商店生产商业销售的软件,以管理几个相当专业的行业的中小型企业。因为这些行业是面向客户的,所以大部分软件都与存储和管理客户信息有关。特别是客户信用卡信息的存储(和保护)。当然,随之而来的是 PCI 合规性。

长话短说,我还有几个问题是关于为什么某些事情会以这种方式完成,不幸的是,我目前没有太多资源。这是一家很小的商店(我直接向老板汇报,唯一的其他全职员工也是如此),而老板对这些问题没有答案,之前的开发人员是......呃......不可用。

问题 1:定期重新加密

到目前为止,如果以下任一条件为真,该软件会提示用户对数据库中的所有敏感信息(基本上是信用卡号和用户密码)进行全面重新加密:

  1. 数据库中有任何未加密的敏感信息片段(例如,通过手动数据库语句而不是通过业务对象添加)。在软件的正常使用过程中不应发生这种情况。

  2. 当前密钥已使用超过特定时间段。我相信这是12个月,但我不确定。这里的重点是密钥“过期”。

这是我第一次涉足与 PCI 相关的商业解决方案开发,因此很遗憾我没有受过相关实践方面的教育。PCI 合规性的某些方面是否要求(甚至强烈建议)定期更新密钥?

这对我来说不是一个大问题,除了如果他们问为什么提示他们运行它,我目前没有很好的解释给最终用户。

问题 1:密钥到期标准的概念是标准吗?如果是,那仅仅是行业标准还是 PCI 的一个元素?

问题 2:密钥存储

这是我真正的问题......加密密钥存储在数据库中,只是被混淆了。密钥在左右两侧填充了一些垃圾字节,一些位被扭曲,但基本上没有什么能阻止有进取心的人检查我们的(dotfuscated)代码,确定用于将存储的密钥转换为真实密钥的模式,然后使用该键运行 amok。这对我来说似乎是一种可怕的做法,但我想确保这不仅仅是这个行业的人们所采取的那些“笑着忍受”的做法之一。我开发了一种替代方法来防止此类攻击,但我只是在这里寻找健全性检查。

问题2:这种密钥存储方法——即使用客户端代码中存在的混淆方法将密钥存储在数据库中——是正常的还是疯狂的?

相信我,我知道免费建议值得我为此付出的每一分钱,这里没有人是律师(或者至少不提供法律建议)、买主等,但我正在寻找对于你们都可以提供的任何输入。先感谢您!

4个回答

问题 1:您提到密码加密。首先,为什么使用密码而不是密码的加盐哈希?至于密钥轮换/到期,我已经看到(并编码)这样的策略。密钥使用的时间越长(使用次数越多),它可能被包含/发现的风险就越高。一些系统,例如 Windows DPAPI 自动使密钥过期,SSL 证书具有过期日期,在此之后许多系统将不会使用它们来加密新数据等等。

问题2:是的,这很糟糕。非常糟糕。

PAN 状态的 PCI 合规审计规范“强加密,例如 Triple-DES 128 位或 AES 256 位,以及相关的密钥管理流程和程序”

轮换可以说是密钥管理过程的一部分,并且将密钥安全地存储在数据之外绝对是密钥管理过程的一部分。

审计规范的第 3.6.4 节进一步说明

定期密钥更改

  • 相关应用程序认为必要和推荐(例如,重新键入);
  • 最好自动 至少每年一次

如果您还没有,我建议您查看PA-DSS 和 PCI-DSS 文档,因为它们有很多信息。关于要求。如果您的软件已通过 PA-DSS 认证,那么我猜您将拥有一个 QSA,他应该拥有有关通过这些要求的期望的更具体信息。

在管理数据加密方面,如果可以的话,我建议使用您在获取应用程序级加密时使用的任何数据库引擎的内置功能。对可能非常棘手。这里有一篇关于选项的好论文

问题 #1:定期重新加密
(也称为重新加密)。是的,这是正常的,但不是必需的。
具体来说,过期密钥必要的,并且是 PCI 要求的。每年至少一次,可以选择更早进行。
您如何处理是另一回事...例如,一旦 2010 年的密钥到期,您将如何处理使用该密钥加密的所有数据?
一种解决方案是存储所有密钥的历史记录,以及每条数据的“密钥版本”,以便在解密时知道要使用哪个密钥。(当然,您只使用新密钥进行加密。)另一个解决方案是前面提到的重新加密 - 每个点只有一个(重新加密期间除外......),到期时,用旧密钥解密并用新密钥重新加密一。

问题 #2:密钥存储
很简单,它很糟糕,并且使加密(不完全,但几乎)毫无意义。
一般而言,适当的密钥管理技术,特别是 PCI,定义了严格的密钥管理策略和程序。其中一些是技术性的:例如,必须使用强加密(例如 DPAPI)对加密密钥 (EK) 进行加密;其中一些是程序性的:例如,必须记录对密钥加密密钥 (KEK) 的访问;其中一些是手动的:例如 KEK 的拆分知识/双重控制。

正如@Rory 所说,与您的 PA QSA 交谈,如果您没有 - 获取一个。

我对第二个问题最感兴趣。有时我很难理解将加密密钥存储得如此接近加密数据的原因,即使您使用密钥加密密钥对其进行加密存储。

我能想到的唯一原因是使用数据库加密基础设施/功能来执行透明加密/解密。不过,这是高度特定于数据库供应商的(如前一篇文章链接的文档中所述)。

我建议将密钥保存在不同的存储中,受密码或 HSM 设备保护。