【问题标题】:String passwords in java on database connections数据库连接上java中的字符串密码
【发布时间】:2023-02-08 22:20:22
【问题描述】:

最近我们添加了一个工具来查找我们组织中的安全漏洞。发现的问题之一是当连接到数据库时(例如使用 Hikari),我们必须提供一个包含密码的字符串(当然是加密的,使用时会解密)。

现在,将密码保存在字符串中并不安全,因为它可以被提取,直到垃圾收集器出现并清除它。

所以我们开始更改我们的代码以使用 char[] 和 byte[](不确定这是最好的,但想法是我们可以在使用后清除数组,而不是等待垃圾收集器为我们清除它)来设置我们的Hikari 上的密码,但流程的最后一部分是为 Hikari 设置一个未加密的密码字符串。所以所有这些大惊小怪的事情都是为了发现 Hikari 将密码保存在一个字符串中。

那么我是否应该更改 Hikari 代码并将其重新编译为我们自己的 Hikari 组织实现,它使用来自 char[] 的密码?或者是什么?

我们怎样才能避免这种情况?

【问题讨论】:

  • 现在,将密码保存在字符串中并不安全……所以我们开始更改代码以使用 char[] 和 byte[]“你认为字符串如何存储它们的字符?Java 9 之前的char[]和现在的byte[]。这个练习毫无意义。你只是让你自己的生活变得更加艰难,最多 - 给攻击者带来轻微的不便。@ 987654321@
  • 它可以被提取,直到垃圾收集器出现并清除它" 如果攻击者可以物理访问您的服务器内存,那么您遇到的问题比他们读取密码还要大。
  • 也许应该忽略“工具”?不要做计算机告诉你做的所有事情。
  • 因此,根据您的 cmets,我的理解是这是毫无意义的,使用加密字符串很好。正确的?
  • 你说的是客户端还是服务器?

标签: java spring jdbc hikaricp


【解决方案1】:

现在,将密码保存在字符串中并不安全,因为它可以被提取,直到垃圾收集器出现并清除它。

仅当某人有足够的访问权限来捕获内存中的内容(或磁盘上的交换空间)时。如果某人拥有该访问权限,那么他们可能可以执行以下一项或多项操作:

  • 在字节码级别修改您的应用程序以注入代码以捕获秘密
  • 附加调试器并使用它在使用秘密的点设置断点
  • 从文件系统、数据库等读取秘密
  • 带着你的硬盘等走出你的机房,然后在他们空闲的时候攻击他们
  • 等等。

花费大量精力使用char[] 处理密码不会解决任何其他窃取秘密的​​方法。

而且它不会解决其他各种安全失误......

那么我是否应该更改 Hikari 代码并将其重新编译为我们自己的 Hikari 组织实现,它使用来自 char[] 的密码?或者是什么?

那就是你如果你想解决这个攻击媒介,你需要做的。永远不要在 String 对象中保存密码,并确保尽快清除 char[]byte[] 或您用来保存它们的任何内容。

你“应该”这样做吗?耸肩。

做一个满的安全风险评估,看全部的问题,并决定这是否会对全面的安全。平衡它与创建和维护 Hikari 补丁(以及其他东西)的成本以及另一方面如果秘密被盗对您的组织的成本。

但是我们不能决定你应该做什么。甚至不可能给你一个客观的建议,因为我们不了解完整的上下文。

【讨论】:

    【解决方案2】:

    同意迈克尔的观点。 永远记住:“人比机器更伟大”

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多