您在 Java Web 应用程序中的什么位置存储密钥?[已关闭]

2022-09-02 13:32:47

密码学是一种广泛采用的技术,以确保机密性。不考虑实现缺陷,它有一个关键点:密钥存储。如果密钥被盗,整个系统将受到损害。

编辑:

让我指定上下文以使问题不那么广泛:

  1. 这里解决了java Web应用程序
  2. 更具体地说,它使用的是弹簧框架版本3
  3. 弹簧安全3.1用于保护应用程序
  4. 一个 mysql5 数据库可用
  5. 应用程序服务器是 tomcat6 或 tomcat7
  6. 服务器计算机在我的控制之下

也许问题可以集中在这种情况上,但是,正如所指出的,密钥存储的问题是横向的,而不是采用的技术。但是,一些库可能会提供一些特殊的功能,这些功能可以以某种方式促进工作。一个明确的点是,必须在安全和做实际事情的需要之间找到权衡。要完成分析,很明显,所需的安全级别取决于要保护的信息的价值。改变我们的想法来执行超级安全的策略(需要付出很多努力)来保密客户的鞋子尺寸是毫无意义的。

在这里,我必须保护一个电子邮件密码(该密码将存储在数据库中)。我认为这些信息平均至关重要。

我在这里寻找的是经过合理努力的最佳解决方案。

所以问题非常清楚:你会在哪里存储这些信息?

  1. 您是否将其存储在数据库中?所以它应该被加密,这需要另一个密钥(你在哪里存储第二个密钥?
  2. 你把它存放在包装里吗?如何防止未经授权访问源?.war
  3. 您是否采用不同的策略?

您的策略的动机将受到赞赏。谢谢


答案 1

我冒昧地写了一个答案,即使这与Java Web应用程序没有任何关系:我认为问题存在于所有平台的微小差异中。

基本上,密钥存储有 3 个候选项,您提到的前 2 个候选项:

  • 数据库
  • 应用程序(“硬编码”)
  • 服务器上其他运行 WebApp 的某个位置,最常见的是文件

你已经把你的手指放在前2个的弱点上,所以没有必要重复,我完全同意。

这也是我使用第三位候选人的动机。理由是这样的:

  • 同一应用程序的不同实例可以很容易地具有不同的密钥,因此一个密钥的妥协不会自动传播到所有其他应用程序。
  • 如果服务器以某种方式受到损害,允许攻击者读取任何文件,那么游戏就结束了:您将无法阻止他读取应用程序二进制文件或数据库
  • Web服务器上的文件系统安全性是一个非常容易理解的主题
  • 从统计上讲,允许完全文件系统访问的闯入频率远低于应用程序或数据库闯入

答案 2

无论您总是需要将密钥存储在某个地方。即使您决定(这很愚蠢)手动提供密钥,那么密钥也会驻留在内存中,有人可以找到它。

存储位置取决于您的选择。但是,它不应该是纯文本。因此,如果将密钥存储在数据库中,则在应用程序中使用硬编码的辅助密钥。因此,如果入侵者只能访问数据库,则加密的主密钥受到保护。

我会进行应用程序配置以将辅助密钥存储在容器中。这样,只有您的应用程序才能访问此属性。因此,攻击者必须控制您的应用程序或容器才能访问该密钥。

因此,假设以下场景:

  1. 您的应用程序被黑客入侵:攻击者拥有与您相同的权限。人们可以尝试使用您的API来获取敏感信息,而无需使用加密。您的代码将为他们完成此操作。下一个选项:她可以尝试获取您的war文件或类文件并反编译它们以找出硬编码密钥,或了解您使用的加密机制。
  2. 只有数据库被黑客入侵:使用不在数据库本身中的密钥加密数据应该没问题。

使攻击者更难。您可以将文件放在文件系统中。如其他答案中所述,向其添加适当的 FS 权限。但是,另外使用java安全管理器来限制所有java类的访问,除了真正需要读取它的类。限制对 jar 和类文件的修改也是一个好主意。

您拥有的锁越多,您就越安全。因为它是标准门锁。锁应来自不同的供应商和不同的机制。但最后,熟练的窃贼无论如何都会进入。


推荐