Storing/Reading 来自 Java 程序的敏感数据

Storing/Reading sensitive data from Java program

我正在开发一个程序,该程序需要将数据永久存储在机器的某个位置,这样当我关闭程序时数据不会消失。 数据是我无法散列的东西,因为程序需要检索它的值。

这个数据库需要超级安全,这样只有程序本身才能访问这个存储,其他任何东西都不能访问。

现在,SQL 对我来说似乎很不安全,如果你有权访问 SQL 你就可以访问其中包含的每个数据库,唯一的办法就是加密一些我插入的数据的一部分,但这会导致为此存储另一个密钥。

这是我需要存储的结构:

FileName  |         Key         | GroupOwner
----------|---------------------|-----------
foo.txt   | $iv44dsfggsdvav523v | adminGroup
----------|---------------------|-----------
bar.txt   | %iihg9v8326h5798v93 | adminGroup

基本上,文件存储在服务器上并使用密钥加密,如果有人闯入服务器,他们应该无法读取密钥并因此解密文件,但只有程序才能做到这一点.

有什么方法可以存储我的程序只能可以读取和修改的数据?

最后,一个程序只不过是一个写下来的算法;或者换句话说 协议 .

意思是:无论你在程序中放入什么样的代码;最后,它是关于一系列动作的。从这个意义上说:另一个完全不同的程序总是有可能做同样的事情。

所以最后,"software only" 解决方案总是会暴露某些风险。

这就是为什么 "high end" 解决方案总是结合多个 "layers";提供不同的保护方式。

换句话说:在某些时候你需要信任。如果 "attacker" 可以 访问 您的软件 运行 打开的系统,那么所有投注都是 关闭 。因为这样他就可以使用调试器进行攻击;甚至拆掉驱动器;并在不同的系统中分析它。

意思是:你无法保护自己免受一切伤害。当您的程序在您控制的硬件上运行时;那么好吧,你是"protected"。但如果没有;那么您根本无法在该系统上存储敏感信息!

SO 上有几个类似的问题 - this 是一个很好的概述(即使它适用于 Web 应用程序)。

简而言之,你无法解决这个问题,这是先有鸡还是先有蛋的问题。常见的解决方案是将密钥存储在文件系统上,并使用操作系统的安全性来确保只有授权用户才能读取它。