临时存储敏感数据

Ruu*_*uud 4 security cryptography temporary-files sensitive-data

场景如下:应该临时存储一个加密密钥,以便应用程序的多个实例可以(顺序)访问它。使用后,当然应该从系统中删除密钥。然而,这带来了一个问题。我承认只要存储了密钥,系统就容易受到攻击,但我希望系统在存储密钥之前和之后都是安全的。

简单地将密钥写入文件并在之后覆盖它在所有情况下都不起作用:某些文件系统将更改写入磁盘的不同部分,而不是同一位置。在这种情况下,之后仍然可以检索密钥。我不能依赖具有全盘加密的用户。

那么最合乎逻辑的选择似乎是使用另一个将密钥保存在内存中的进程,但是操作系统可能会在某些点将内存写入磁盘,从而导致与上述相同的问题。

可以加密密钥,但这并不安全。临时存储密钥的全部意义在于,用户无需在每次运行程序时都输入它。这意味着用于加密密钥的密钥也必须存储在某处,或者必须基于已知数据。如果存储了密钥,那么当然我们现在有安全存储密钥的问题。如果是基于已知数据,则意味着可以在必要时再次生成密钥,因此加密几乎没有用。

我知道有些操作系统提供 API 来保护数据,但这通常依赖于根据用户帐户信息生成加密密钥。即使这是特定于会话的,在会话结束之前数据也不会是安全的(这可能是在密钥应该被擦除之后很久)。

这个问题有什么解决办法吗(不依赖特殊硬件,不需要全盘加密等)?如果没有,在这种情况下我能做的最好的事情是什么?

编辑澄清:当密钥存储在内存中时,它不需要是安全的;此时,用户应保证无法进行物理访问,并且系统没有病毒。使用密钥后,应将其从系统中删除,以便之后具有物理访问权限的任何人或任何程序都可以检查所有内存和磁盘,而不再找到密钥的单个(可用)痕迹。

Phi*_*teG 5

您可以使用 ramdisks(而不是 tmpfs)。请参阅http://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt

“另一个类似的东西是 RAM 磁盘 (/dev/ram*),它在物理 RAM 中模拟了一个固定大小的硬盘,你必须在上面创建一个普通的文件系统。Ramdisk 不能交换,你也没有可能调整大小他们。”

所以基本上,你需要在 /dev/ram* 上创建一个文件系统,然后将它挂载到某个地方。但是,这个挂载点可以被所有进程访问,而不仅仅是特定的进程。

  • 嗯...我相信,您可以(理论上来说)编写一个虚拟硬件驱动程序,然后将其加载到 RAM 中,因此不会交换。但是,密钥将存储在该驱动程序文件中。因此,您需要编写一个可以与之通信以读取/写入密钥的虚拟驱动程序。不过,我对 Windows 的内存管理内部结构没有具体的了解。 (2认同)