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