java - 在 Java Tomcat Web 应用程序中存储加密 key 以加密/解密数据库中的敏感数据的最佳做法是什么?

标签 java spring postgresql tomcat encryption

我们遇到了在将某些敏感数据存储到 PostgreSQL 数据库之前对其进行加密的要求。我们的应用程序是一个运行在 Tomcat 之上的 Spring 应用程序。我们需要存储 key ,以便我们的 Web 应用程序可以在插入数据之前加密数据,并在检索数据之后解密数据。

我们希望避免将此类内容存储在我们的配置文件(或由 Maven 过滤的文件)中,因为这些文件已 checkin 源代码管理并可供任何有权访问的人读取。我们似乎对数据库凭证有同样的问题,但它看起来像 JNDI datasources可能会解决这些问题。

使用 Tomcat 时是否有这方面的最佳实践?环境变量之类的东西可能会起作用,但维护起来会很麻烦。

编辑:澄清一下,我们试图防止由于未经授权访问实际数据库文件而导致敏感数据丢失。我们的数据库与我们的应用服务器位于不同的物理盒子上,因此我们很乐意将 key 保存在应用服务器所在的服务器上。

最佳答案

据我所知,所有关于凭据的最佳实践都优化了易用性(对于运营团队)和代码简化(对于开发团队),而不是优化安全性。这非常令人失望。

我会将要求表述为:永远不要以未加密的形式存储任何凭据或加密 key ,无论是嵌入在属性/配置文件、源代码中还是与应用程序分开管理的文件中。

此要求的一些影响:

  1. JNDI 数据源不适用于 DB 凭据,因为 JNDI 数据源的配置驻留在容器的配置文件中。
  2. 用于加密/解密(例如,用于数据库中的数据)的密码/口令不能驻留在代码或属性文件中。
  3. 您必须实现一种方法,以便运营团队在应用实例化时将 secret 信息传递给应用。

您如何设计一个系统来满足这一要求?

将您的所有 secret 存储在集中位置的加密文件中(例如,在 Amazon S3 或硬件安全模块中)。读取此加密数据的密码/凭据绝不能以数字方式存储 - 它是在应用程序启动时提供的(例如,在 POST 的正文中)。除了 secret 文件的密码外,您可能还需要动态提供凭据才能访问文件本身。

当应用程序收到 secret 文件的密码时,它会破解它并初始化它的内部结构(例如,创建数据库数据源、初始化加密服务等)。

关于java - 在 Java Tomcat Web 应用程序中存储加密 key 以加密/解密数据库中的敏感数据的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128408/

相关文章:

java - 从现有数组创建一个数组并添加额外的元素

java - Hotspot 中的逃逸分析在简单情况下有多脆弱,例如 for-each 循环中的迭代器

java - 在 Spring 框架中使用抽象工厂

regex - Postgresql - 如何使用正则表达式模式提取字符串中第一次出现的子字符串?

java - 具有唯一性检查的 HashMap

java - 任务队列任务遇到 "Process terminated because the backend took too long to shutdown"过于频繁

javascript - 没有 Java 应用程序上下文的 AJAX 调用

spring - 无法配置数据源:未指定 'url'属性,并且无法配置任何嵌入式数据源。原因:Fa

macos - Travis OS X 测试 Postgres

从属性文件 Autowiring Springboot Postgresql 数据源