我有一个包含敏感信息的数据库。我可以对读写操作中的数据进行加密/解密。问题是我需要将密钥存储在应用程序中。如果有人入侵了他们可以访问数据库的方式,那么他们还可以获取应用程序(java)对其进行反编译并提取密钥。
这似乎充其量只是一个减速带。还有哪些其他解决方案可用?
我有一个包含敏感信息的数据库。我可以对读写操作中的数据进行加密/解密。问题是我需要将密钥存储在应用程序中。如果有人入侵了他们可以访问数据库的方式,那么他们还可以获取应用程序(java)对其进行反编译并提取密钥。
这似乎充其量只是一个减速带。还有哪些其他解决方案可用?
您唯一能做的就是难以从应用程序中提取密钥。你不能让它成为不可能。如果您给某人一个包含您要保护的内容的盒子,如果您希望他们能够访问内容,则必须给他们密钥。一旦你给了他们钥匙,他们就可以为所欲为……如果他们不厌其烦地找到钥匙。
这是 Bob 和 Eve 是同一个人的情况,您想授予 Bob 访问权限但阻止 Eve 看到它。
这是 DRM,它不起作用。
我假设您有某种方法可以在允许用户访问数据库之前验证用户的凭据?
通常这类事物的架构如下:
客户端连接到服务器,然后服务器连接到数据库。服务器确保客户端在允许他们访问敏感信息之前正确地进行身份验证。解密密钥仅存储在服务器上。没有人应该有权访问服务器,尤其是包含密钥的文件。这样,客户端就不必进行任何加密/解密,也不必存储任何密钥。
阅读密钥库。
要求用户输入密码才能访问他们的数据。将密钥埋在代码中是默默无闻的安全性。
将密钥存储在 CSP 容器中。考虑这里的 Java CSP。
这是 IMO 最安全的方式。但是您也可以考虑将密钥存储在受操作系统使用某种 ACL 保护的文件中。
要求用户使用强密码登录;使用密码作为对称加密算法的密钥来解密非对称数据库密钥
在应用程序运行时将 db 密钥保存在安全内存中(如果这是一个选项)
加密密钥(使用 DPAPI),将其放入文件中,在该文件上放置 ACL 等...