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

时间:2009-08-11 22:32:14

标签: memory cryptography key aes

背景: 我在数据库中使用AES(即对称加密)加密了一些数据。在(假设的)安全且隔离的Linux机器上运行的服务器端应用程序使用此数据。它从DB读取加密数据,并写回加密数据,仅处理内存中未加密的数据。 因此,为了做到这一点,应用程序需要将密钥存储在内存中。

问题是,对此有什么好的最佳做法吗?将密钥保存在内存中。

一些想法:

  1. 将其保存在无法维持的内存中(对于linux:使用SHM_LOCK设置shmctl(2)?)
  2. 将密钥分割到多个内存位置。
  3. 加密密钥。有什么,以及如何保持......钥匙......安全吗?
  4. 每次需要时从文件中加载密钥(慢,如果恶人可以读取我们的内存,他也可以读取我们的文件)
  5. 密钥泄漏原因的一些场景:恶意获取mem dump / core dump;检查代码导致信息泄漏的不良界限;

    第一个似乎是一个很好而且很简单的事情,但剩下的呢?其他想法?任何标准规范/最佳实践?

    感谢您的任何意见!

6 个答案:

答案 0 :(得分:8)

全部取决于您的偏执程度和关键/数据的敏感度。在极端情况下,只要您在内存中有未加密的密钥,就可以使用coldboot技术检索它。 frozencache有一个有趣的发展,试图打败它。我只是随意地阅读它,没有在实践中尝试它,但它似乎是一种有趣的尝试方法。

虽然锡箔帽已关闭 - (1),(2),(3)看似合理。 (4)由于你提到的原因,不会精确切割它。 (不仅速度很慢,而且假设您读入堆栈,使用不同的堆栈深度,密钥可能会多次显示)。

假设解密数据是值得的,并且它将在可交换内存中,你肯定也应该加密交换本身。此外,root,/ tmp分区也应加密。这是一个相当标准的设置,在大多数操作系统指南中都可以使用。

然后,当然,您希望确保机器本身的高水平物理安全性最小化它执行的功能 - 代码运行越少,曝光越少。您还可能希望了解如何绝对最小化远程访问此计算机的可能性 - 即使用基于RSA密钥的ssh,这将被另一个主机控制的另一个ACL阻止。在能够登录到第二个主机之前,portknocking可以用作身份验证的附加向量之一。为确保主机 受到攻击,将数据输出更加困难,确保此主机没有可直接路由到Internet的连接。 一般来说,你越是痛苦地获取敏感数据,人们去那里的机会就越少,但是这也会让普通用户的生活变得痛苦 - 所以需要有一个平衡。

如果应用程序严重且涉及的事物数量很多,最好构建更明确的整体威胁模型,并查看可以预见的可能的攻击向量,并验证您的设置是否有效处理他们。 (并且不要忘记包含human factor: - )

更新:实际上,您可以使用专用硬件来处理加密/解密。然后你不必处理密钥的存储 - 参见Hamish的回答。

答案 1 :(得分:4)

如果您对安全性非常认真,那么您可以考虑使用单独的加密子系统。最好是FIPS 140-2/3认证的(list of certified modules) 然后将密钥保存在防篡改存储器中(不可提取),并且所有加密操作都在加密边界内执行。
价格昂贵,但对于某些必要的应用程序。

答案 2 :(得分:1)

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

一般情况下,你必须假设恶人无法访问根级别的操作系统或硬件,因为即使它只是在RAM中,他们最终也会设法获取密钥。

所以你假设服务器的操作系统是安全的。但是,让我们说有人可以来窃取硬盘,所以启动服务器会给他们钥匙。然后让服务器向另一台服务器询问密钥的一半,远程服务器验证请求(使用ip,私钥/公钥对)并提供一半密钥。然后你的服务器有一个完整的密钥,远程服务器永远不会超过一半。在我看来,保护水平有所提高。

答案 3 :(得分:1)

我正在看什么

处理密钥时执行。他们对这些安全问题充满了偏执......

答案 4 :(得分:1)

另外,不要忘记核心转储的威胁和你的记忆被换掉!

在POSIX(如Linux)和Windows系统上,如果您正在处理C语言,有一些技术可以防止这种情况发生 - 请参阅CERT安全编码标准中的这一部分:

MEM06-C. Ensure that sensitive data is not written out to disk

答案 5 :(得分:0)

使用“超级超级用户”硬件内存是理想的选择。所有Intel Mac都具有此SecureEnclave内存区域,并且还在硬件中包含AES解密,以便应用程序和操作系统永远不能访问原始私钥。当机器启动时,输入密码(可选),SecureEnclave将其冷闪存加密版密钥解密到其RAM区域,主操作系统无法访问该区域。

好的副作用是硬件加速加密:我在新格式化的加密磁盘上对我的PCIe存储进行了600 MB /秒的写入基准测试。

在云端,亚马逊拥有此AWS密钥管理服务(KMS)托管服务,可让您轻松创建和控制用于加密数据的加密密钥,并使用经过FIPS 140-2验证的硬件安全模块进行保护密钥的安全性:https://aws.amazon.com/kms/