我有一个包含敏感信息的数据库。我可以在读写操作中加密/解密数据。问题在于我需要在应用程序中存储密钥。如果有人通过黑客手段进入了数据库,那么他们也可以获取应用程序(java)并反编译它以获取密钥。
这似乎最多只是一个减速带。还有哪些其他解决方案可用?
我有一个包含敏感信息的数据库。我可以在读写操作中加密/解密数据。问题在于我需要在应用程序中存储密钥。如果有人通过黑客手段进入了数据库,那么他们也可以获取应用程序(java)并反编译它以获取密钥。
这似乎最多只是一个减速带。还有哪些其他解决方案可用?
你唯一能做的就是让从你的应用中提取密钥变得困难。你无法做到不可能。如果你给别人一盒要保护的东西,你必须给他们钥匙,如果你想让他们能够访问内容。一旦你把钥匙给了他们,他们可以做任何他们想做的事情……只要他们费劲找到了钥匙。
这是Bob和Eve是同一个人的情况,你想给Bob访问权限,但停止Eve看到它。
这是数字版权管理,它不起作用。
我假定您有某种方法验证用户的资格,然后才允许他们访问数据库?
通常这些事情的架构如下:
The Client connects to the Server, which then connects to the Database. The Server makes sure the Client authenticates correctly before allowing them access to sensitive information. The decryption key is stored only on the server. Noone should have access to the server, and especially the file that contains the key. This way the clients do not have any encryption/decryption they have to do, and do not have to store any keys.
研究一下密钥库。
要求用户输入口令才能访问他们的数据。在代码中隐藏密钥是一种安全性受遮蔽的做法。
把密钥存储在CSP容器中。请查看此处的Java CSP(http://www.cs.kent.ac.uk/projects/ofa/jcsp/jcsp-1.1-rc4/jcsp-doc/overview-summary.html)。
这是从我的角度来看可能最安全的方式。但你也可以考虑将密钥存储在受某种ACL保护的文件中,以保护操作系统。
要求用户使用强密码登录;使用密码作为对称加密算法的密钥解密非对称数据库密钥。
在应用程序运行时将数据库密钥保持在安全内存中(如果可行)。
将密钥加密(使用DPAPI),将其放入文件中,并在该文件上施加ACL等...