暂存敏感数据

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

除非您可以使用FIPS-140加密模块,否则这些问题很难解决。通常,处理安全问题的第一步是确定您要防御的攻击者类型。他们是否可以物理访问系统?他们有多少时间?他们有多少钱?如果某人可以物理访问机器并且只使用软件,那么您将无法保护产品,但是如果您将目光放低一点,您可能会找到一个可行的解决方案。 - tbroberg
攻击者可能具有物理访问权限,但只限于密钥存储之前和密钥移除之后。时间和金钱通常会受到限制,但我希望有一个安全的解决方案,无论攻击者是谁。我发现在Windows上使用VirtualLock和Linux上的mlock可以防止交换。这是一个很好的起点,但是如何在进程之间安全通信呢? - Ruud
所以,使用案例是:A) 房间被清除所有坏人。B) 用户通过密码登录。C) 用户在登录状态下执行操作,各种进程使用密钥内容。D) 用户注销并销毁密钥的所有痕迹。E) 坏人重新进入房间并搜索机器以寻找密钥的线索。我们允许用户输入一次密码。目标是确保在坏人到达 E) 之前,密钥被完全清除。对吧? - tbroberg
如果我是你的对手,我会试图攻击不是钥匙本身,而是验证钥匙的位置。我会检查代码,找到在检查钥匙后紧接着的分支指令,并将其修改为始终无条件接受该钥匙。对于那些有时间和物理接触机器的人来说,保护系统真的很难。保护系统的努力成为混淆的一种形式,以使找到钥匙和验证它的位置更加困难。 - tbroberg
你说的"让用户输入一次密码"是什么意思?当房间没有坏人时,用户只需要输入一次密码(生成密钥);你的使用情景是正确的。然而,这个密钥并不用于验证,而是用于解密/加密数据。(当然,这些数据应该以与密钥相同的方式进行保护;最终目标是将这些加密数据隐藏起来,远离坏人的视线)。然而,加密数据可以在一个流程中处理,因此一切都可以在内存中完成处理。 - Ruud
我最初并没有理解密钥的一部分是存储在用户头脑中的,这确实简化了事情。感谢您的澄清。 - tbroberg
1个回答

6
您可以使用ramdisk(而不是tmpfs)。请参见http://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt
“另一个类似的东西是RAM磁盘(/dev/ram *),它在物理RAM中模拟固定大小的硬盘,在其上必须创建普通文件系统。Ramdisk不能交换,并且您无法调整其大小。”
因此,基本上,您需要在/dev/ram*上创建文件系统,然后将其挂载到某个位置。但是,所有进程都可以访问此挂载点,而不仅仅是特定的进程。

这是一个非常有趣的解决方案。公共访问并不是一个很大的问题;内存也可以被其他进程访问;我们只能让它难以被访问。你有没有想过如何在没有ramdisk支持的平台上(比如Windows)实现相同的效果,同时保证不会发生交换? - Ruud
2
好的...我相信,你(理论上)可以编写一个虚拟硬件驱动程序,然后将其加载到RAM中,因此不会被交换出去。但是,关键是存储在那个驱动程序文件中的。因此,您需要编写一个虚拟驱动程序,以便与之通信以读取/写入密钥。不过,我对Windows的内存管理内部没有具体的了解。 - PhilMasteG

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