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

Memory 密码学:内存中密钥的最佳实践?,memory,cryptography,key,aes,Memory,Cryptography,Key,Aes,背景: 我在数据库中得到了一些用AES(即对称加密)加密的数据。服务器端应用程序在(假定)安全且隔离的Linux机箱上运行,使用此数据。它从数据库中读取加密数据,然后写回加密数据,只处理内存中未加密的数据。 因此,要做到这一点,应用程序需要将密钥存储在内存中 问题是,这方面有什么好的最佳实践吗?保护内存中的密钥 一些想法: 将其保存在不可读取的内存中(对于linux:使用shmctl(2)?)设置SHM_锁) 将密钥拆分到多个内存位置 加密密钥。用什么,以及如何保管…钥匙。。安全吗 每次需要时从

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

问题是,这方面有什么好的最佳实践吗?保护内存中的密钥

一些想法:

  • 将其保存在不可读取的内存中(对于linux:使用
    shmctl(2)
    ?)设置
    SHM_锁
  • 将密钥拆分到多个内存位置
  • 加密密钥。用什么,以及如何保管…钥匙。。安全吗
  • 每次需要时从文件加载密钥(速度慢,如果作恶者可以读取我们的内存,他可能也可以读取我们的文件)
  • 关于密钥泄漏原因的一些场景:邪恶者获得memdump/core dump;错误的代码边界检查导致信息泄漏

    第一个看起来是一件很好的简单的事情,但是其他的呢?其他想法?是否有标准规范/最佳实践


    谢谢你的意见

    这一切都取决于你的偏执程度和关键/数据的敏感性。在极端情况下,只要内存中有未加密的密钥,就可以使用技术检索它。目前有一个有趣的发展趋势,就是试图战胜这一点。我只是随便读了一下,并没有在实践中尝试,但这似乎是一个有趣的尝试方法

    不过,摘下锡箔帽后,(1)、(2)、(3)看起来确实合理。(4) 因为你提到的原因,我不会剪掉它。(不仅速度慢,而且假设您读入堆栈,使用不同的堆栈深度,键可能会多次可见)

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

    然后,当然,您希望确保机器本身的高级别物理安全性,并将其执行的功能最小化-代码运行越少,暴露越少。您还可能希望了解如何将远程访问此计算机的可能性降至最低,即使用基于RSA密钥的ssh,这将被另一台主机控制的另一个ACL阻止。在能够登录到第二台主机之前,可以用作身份验证的附加向量之一。为确保在主机受损时,更难将数据取出,请确保此主机没有到internet的直接可路由连接。 一般来说,获取敏感数据的过程越痛苦,人们获取敏感数据的机会就越小,但这也会让普通用户的生活痛苦——因此需要平衡

    如果应用程序很严重,并且风险很大,那么最好构建更明确的总体威胁模型,看看您可以预见哪些可能的攻击向量,并验证您的设置是否有效地处理它们。(别忘了包括:-)


    更新:实际上,您可以使用专门的硬件来处理加密/解密。然后你就不必处理密钥的存储问题了——见哈米什的答案。

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

    一般来说,您必须假设作恶者没有访问根级操作系统或硬件的权限,因为在这种情况下,他们最终会设法获得密钥,即使密钥只在RAM中


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

    < P>如果你对安全性很重视,那么你可以考虑一个单独的密码子系统。最好是经过认证的()。
    然后密钥保存在防篡改内存中(不可提取),所有加密操作都在加密边界内执行。

    价格昂贵,但对于某些应用程序来说是必要的。

    我想看看

    • ,
    • ,
    • ,及

    在处理钥匙时,请执行以下操作。他们对这样的安全问题非常偏执…

    也不要忘记核心转储和内存被交换的威胁

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

    使用“超级用户”硬件内存是理想的选择。所有英特尔Mac电脑都有这个SecureEnclave内存区域,它还包括硬件中的AES解密,这样应用程序和操作系统就永远无法访问原始私钥。机器启动时,会键入密码(可选),SecureEnclave会将其冷闪存加密版本的密钥解密到其RAM区域,而主操作系统无法访问该区域

    好的副作用是硬件加速加密:我在新格式化的加密磁盘上以600 MB/秒的速度写入PCIe存储

    在云计算中,Amazon有一个AWS密钥管理服务(KMS)管理的服务,使其