您在哪里将密钥存储在Java Web应用程序中?

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

编辑:

让我指出上下文,使问题不那么广泛:

  1. 这里有一个java web应用程序
  2. 更具体地说,它是使用spring框架版本3
  3. spring security 3.1用于保护应用程序
  4. 一个mysql5数据库可用
  5. 应用服务器是tomcat6或tomcat7
  6. 服务器机器不在我的控制之下

也许问题可以集中在这种情况上,但正如所指出的,秘密密钥存储的问题是横向于所采用的技术。 然而,一些图书馆可能提供特殊的function,可以某种方式促进工作。 一个明确的观点是,必须在安全性和实际需要之间找到权衡。 为了完成分析,很明显所需的安全级别取决于要保护的信息的价值。 将我们的思想转变为执行超级安全策略(需要付出很多努力)以保持客户的鞋码大小是毫无意义的。

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

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

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

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

我们将非常感谢您的战略动机。 谢谢

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

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

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

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

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

  • 同一个应用程序的不同实例可以轻松拥有不同的密钥,因此一个密钥不会自动传播到所有其他密钥
  • 如果服务器以某种方式受到攻击,允许攻击者读取任何文件,那么无论如何都是游戏:你无法阻止他阅读应用程序二进制文件或数据库
  • Web服务器上的文件系统安全性是一个非常容易理解的主题
  • 与应用程序或数据库入侵相比,允许完整文件系统访问的入侵在统计上更不常见

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

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

我会去应用程序配置来存储容器中的二级密钥。 这样只有您的应用程序才能访问此属性。 因此,攻击者必须控制您的应用程序或容器才能访问该密钥。

因此,假设以下情况:

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

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

你拥有的锁越多,你就越安全。 与标准门锁一样。 锁应该来自不同的供应商,并且具有不同的机制。 但最后,熟练的窃贼无论如何都会进入。

文件系统没问题,选择用户权限并使用战争授权权限。 有很多安全漏洞只能打开数据库或战争内容