Memory 密码学:内存中密钥的最佳实践?
背景: 我在数据库中得到了一些用AES(即对称加密)加密的数据。服务器端应用程序在(假定)安全且隔离的Linux机箱上运行,使用此数据。它从数据库中读取加密数据,然后写回加密数据,只处理内存中未加密的数据。 因此,要做到这一点,应用程序需要将密钥存储在内存中 问题是,这方面有什么好的最佳实践吗?保护内存中的密钥 一些想法:Memory 密码学:内存中密钥的最佳实践?,memory,cryptography,key,aes,Memory,Cryptography,Key,Aes,背景: 我在数据库中得到了一些用AES(即对称加密)加密的数据。服务器端应用程序在(假定)安全且隔离的Linux机箱上运行,使用此数据。它从数据库中读取加密数据,然后写回加密数据,只处理内存中未加密的数据。 因此,要做到这一点,应用程序需要将密钥存储在内存中 问题是,这方面有什么好的最佳实践吗?保护内存中的密钥 一些想法: 将其保存在不可读取的内存中(对于linux:使用shmctl(2)?)设置SHM_锁) 将密钥拆分到多个内存位置 加密密钥。用什么,以及如何保管…钥匙。。安全吗 每次需要时从
shmctl(2)
?)设置SHM_锁
)谢谢你的意见 这一切都取决于你的偏执程度和关键/数据的敏感性。在极端情况下,只要内存中有未加密的密钥,就可以使用技术检索它。目前有一个有趣的发展趋势,就是试图战胜这一点。我只是随便读了一下,并没有在实践中尝试,但这似乎是一个有趣的尝试方法 不过,摘下锡箔帽后,(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)管理的服务,使其