场景如下:需要临时存储一个加密密钥,以便多个应用程序实例可以访问它(按顺序)。使用后,密钥当然应从系统中删除。但是,这会带来一个问题。只要密钥存储,系统就易受攻击,但我希望在存储密钥之前和之后系统都是安全的。
简单地将密钥写入文件并随后覆盖它,并不适用于所有情况:某些文件系统会将更改写入磁盘的不同位置,而不是相同的位置。在这种情况下,仍然可以在之后检索到该密钥。我不能指望用户具有全盘加密。
那么最合理的选择似乎是使用另一个进程来保持密钥在内存中,但操作系统可能会在某些时刻将内存写入磁盘,导致与上述描述相同的问题。
对密钥进行加密是可能的,但这并不更安全。临时存储密钥的整个重点在于,用户不需要为每次运行程序键入密钥。这意味着用于加密密钥的密钥也必须存储在某处,或者它必须基于已知数据。如果存储了密钥,则当然现在存在安全存储此密钥的问题。如果它基于已知数据,那么这意味着必要时可以再次生成密钥,因此加密几乎没有用处。
我知道一些操作系统提供API以保护数据,但这通常依赖于基于用户帐户信息生成加密密钥。即使这是会话特定的,数据也不会在会话结束之前(可能是密钥应该被擦除之后很久)得到保护。
有没有任何解决此问题的解决方案(不依赖于特殊硬件,不需要全盘加密等)?如果没有,那么在这种情况下我能做的最好的是什么?
编辑以澄清: 在内存中存储密钥时,无需保证其安全性;此时,用户应保证不存在物理访问,并且系统无病毒。使用后,应从系统中删除密钥,以便之后任何有物理访问权限或任何程序都可以检查所有存储器和磁盘,并且找不到单个(可用)密钥的痕迹。
编辑以澄清: 在内存中存储密钥时,无需保证其安全性;此时,用户应保证不存在物理访问,并且系统无病毒。使用后,应从系统中删除密钥,以便之后任何有物理访问权限或任何程序都可以检查所有存储器和磁盘,并且找不到单个(可用)密钥的痕迹。
VirtualLock
和Linux上的mlock
可以防止交换。这是一个很好的起点,但是如何在进程之间安全通信呢? - Ruud