我正在研究密钥管理解决方案,以实现PCI兼容。我已经和竞技场上的许多供应商谈过了,虽然我喜欢他们的产品,但成本超出了我的预算。有人知道密钥管理的任何开源或低成本解决方案吗?我使用Windows/.NET环境,所以我更喜欢针对该环境的解决方案,但我有兴趣了解任何现有的解决方案。
感谢
看看KeyManager,它是OpenStack套件的关键管理组件。该应用程序可以用作OpenStack之外的独立密钥管理解决方案。
作为OpenStack的一个组件,KeyManager正在积极开发中,计划每六个月开发一次新功能。
我们也有类似的经历。我们需要一个用于PCI合规性的关键管理解决方案,而我们看到的所有商业产品都太贵了。对于小客户来说,一些关键经理的成本比我们的产品还高!
我们最终做了一个基于软件的密钥管理器。我们制定了需求,离岸开发人员对其进行了编码。有一段时间,他们正在寻找其他客户来使用它。我不知道他们现在是否还在。
让我解释一下我们探讨的各种选择。首先要记住的是,PCI合规性和安全性是不同的,你可以是PCI合规的,也可以不是很安全。
选项0-为每个DB列分配一个键,并将键存储在DLL文件中。您的应用程序链接到DLL文件中以访问密钥来加密和解密数据。没有人知道钥匙。对于定期的密钥替换,您使用新密钥创建一个新的DLL,使用旧密钥解密所有数据并使用新密钥重新加密数据需要花费一些时间。然后使用带有新密钥的新DLL重新启动应用程序。(请注意,如果您考虑恢复数据库备份,则需要保留旧密钥。)
当我第一次听说选项0时,我很惊讶它符合PCI。我们不使用选项0。
改进选项0的方法。
如果您的环境中有HSM,请使用HSM加密DLL文件中的密钥。当您的应用程序启动时,它将使用HSM解密密钥。如果您想要更高的安全性,请在每次需要时解密密钥。
一旦您的密钥被加密,就可以安全地将它们存储在DB表中。如果为每个密钥(旧密钥和新密钥)分配一个小整数密钥id,则可以将密钥id与加密数据一起存储。这可以让您进行增量密钥更换,避免停机时间。
在很多过程中,让你的钥匙在内存中清空,会增加你在寻找钥匙时受到内存扫描攻击的风险。您可以创建一个新进程,该进程是唯一解密密钥的进程。您的应用程序与此新进程对话,以加密和解密数据。这个新过程应该在一个有小"表面积"的盒子上进行保护。由于敏感数据现在正在网络上传输,因此应该对这些通信进行加密。SSL是一个不错的选择。
我意识到这是一个旧线程,但有几个选项:
- 一个完全免费和开源的密钥管理解决方案位于http://sourceforge.net/projects/strongkey.我承认,该软件有点过时,安装起来相当复杂,因为它假设你有一个PKI来向应用程序客户端颁发数字证书,以便与密钥管理服务器通信,并保护客户端设备上的密钥
- 最初的StrongKey软件在三年前被大幅简化,并集成到一个带有加密硬件模块(TPM和HSM)的设备中,以提供更强的密钥管理。不幸的是,尽管设备上的软件都是自由开放源码软件,但集成解决方案本身并不是免费的——其价格在其网站上列出(http://www.strongauth.com/products/key-appliance.html)
但是,选项#2有很多优点,因为它允许您在完全符合PCI的情况下利用公共云(搜索"符合法规的云计算(RC3)"并单击IBM上的链接-我只能在回答中发布两个链接),并在旧金山的RSA 2013上发布更多关于如何利用此设备的公告。
我希望这能有所帮助。
KMIP上的KLMS是一个很好且易于使用的密钥管理解决方案。这是一个用Java编写的开源解决方案。请参阅以下链接以供参考。http://www.ibm.com/developerworks/library/se-kmip4j/
名为stubInterface的包将包含通过KMIP使用KLMS所需的所有api。
KLMS:关键生命周期管理系统
KMIP:密钥管理互操作性协议
我会在搜索中添加到这个列表中,其他人可能会从扩展的列表中受益。
我最近发现了KeyWhiz,它似乎在alpha中。
SNipeit是我见过的最好的一个,它是开源的,非常健壮,非常易于使用,即使对于非技术人员来说也是如此。
https://snipeitapp.com/demo/
看看那里。