密码学:内存中密钥的最佳实践?

21

背景:

我在数据库中有一些使用AES(对称加密)加密过的数据。运行在一个假定为安全且隔离的Linux机器上的服务器端应用程序使用这些数据。它从数据库中读取加密数据并写回加密数据,只在内存中处理未加密数据。

因此,为了实现这个目标,该应用程序需要将密钥存储在内存中。

问题是,是否有任何良好的最佳实践来保护密钥的内存安全?

以下是一些想法:

  1. 将其存储在不可交换的内存中(对于Linux:使用shmctl(2)设置SHM_LOCK?)
  2. 将密钥分割成多个内存位置。
  3. 对密钥进行加密。使用什么方法,并如何保护关键密钥的安全?
  4. 每次需要时从文件中加载密钥(缓慢,如果恶意攻击者可以读取我们的内存,他可能也可以读取我们的文件)

关于密钥泄漏的一些情况:恶意攻击者获取到内存转储/核心转储;代码中糟糕的边界检查导致信息泄露;

第一个想法似乎是非常好而且相当简单的方法,但其他方法呢?还有其他的想法吗?是否有标准规范/最佳实践?

感谢任何意见!

6个回答

12
一切取决于您的偏执程度和密钥/数据的敏感程度。在极端情况下,只要您的内存中有未加密的密钥,就可以使用冷启动技术恢复它。在冷启动攻击方面,frozencache有一个有趣的开发来尝试克服这个问题。虽然我只是随意阅读了一下,没有实践过,但似乎是一个有趣的尝试方法。
当然,如果不考虑太多安全问题,(1)、(2)、(3)似乎合理。正如您提到的那样,(4)不能完全解决问题。(不仅速度慢,而且假设您读取堆栈,在不同的堆栈深度下,密钥可能会出现多次)
假设解密的数据很有价值,并且它将存储在交换内存中,则绝对应该加密交换内存本身。此外,根目录和/tmp分区也应加密。这是一个相当标准的设置,可在大多数操作系统的指南中轻松找到。
当然,您还需要确保机器本身具有高度的物理安全性,并且尽量减少其执行的功能-运行的代码越少,暴露的风险就越小。您还可以查看如何绝对最小化远程访问此机器的可能性,例如使用基于RSA密钥的ssh,并由另一台主机控制的另一个ACL阻止它。在能够登录到第二个主机之前,portknocking可用作其他身份验证向量之一。为确保如果主机被攻击,更难将数据提取出去,请勿将此主机直接连接到互联网。通常,使其更难获取敏感数据,生命中某些人得到那里的机会就越小,但这也会使常规用户的生活变得痛苦-因此需要平衡。

如果应用程序非常严肃,涉及的事情很多,最好建立更明确的整体威胁模型,并查看您可以预见到哪些可能的攻击向量,并验证您的设置是否有效地处理它们。(并别忘了包含人为因素 :-)

更新:实际上,您可以使用专用硬件来处理加密/解密。那么,您就不必处理密钥的存储-请参阅Hamish的答案。


1
Firewire设备也可以用来读取内存中的密钥。它们可以直接寻址内存,而一个特别设计的设备可以完全复制内存以供后续分析。请参见http://mmadan.wordpress.com/2008/03/14/physical-hack-via-firewire-port/。 - Eric J.

7
如果您对安全性非常重视,那么您可能需要考虑一个单独的加密子系统。最好是FIPS 140-2/3认证的(认证模块列表)。然后,密钥将保存在防篡改内存中(不可提取),并且所有加密操作都在加密边界内执行。虽然昂贵,但对于某些应用程序来说是必要的。

我相信Mozilla的NSS库可以做到这一点,而且它是免费的。 - Adam Batkin
+1,非常好的观点。我不知怎么忘了专用的加密 :-) - Andrew Y

3

1

最大的问题是程序必须从某个地方读取密钥。除非每次服务器重新启动时都接受直接键盘输入,否则它几乎必须存在于磁盘上。

一般来说,您必须假设恶意用户无法访问根级操作系统或硬件,因为如果是这种情况,即使密钥仅在RAM中,他们最终也会设法获取密钥。

因此,您可以假设服务器的操作系统是安全的。但是假设有人可以来窃取硬盘,以便启动服务器并获得密钥。然后让服务器向另一个服务器请求一半的密钥,远程服务器使用IP、私钥/公钥对验证请求并提供一半的密钥。然后您的服务器就有了完整的密钥,而远程服务器永远不会拥有超过一半的密钥。这对我来说似乎是更高级别的保护。


1

1
使用"超级超级用户"硬件内存是理想的。所有Intel Mac都有这个SecureEnclave内存区域,它还包括一个AES解密硬件,使应用程序和操作系统永远不能访问原始私钥。当机器启动时,输入密码(可选),SecureEnclave将其冷闪存储器加密版本的密钥解密到其RAM区域中,该区域不可被主操作系统访问。
不错的副作用是硬件加速加密:我在新格式化的加密磁盘上对我的PCIe存储进行了600 MB /秒的写入基准测试。
在云中,Amazon拥有AWS Key Management Service(KMS)托管服务,可以轻松创建和控制用于加密数据的加密密钥,并使用FIPS 140-2验证的硬件安全模块来保护密钥的安全性:https://aws.amazon.com/kms/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接