1

我正在维护一个现有的 Java 产品(它有一个巨大的代码库)。我发现它在不少于 4-5 个不同的地方(方法)设置(和获取)两个内部密码作为 Java 系统属性。现在,问题是,密码以纯文本形式存储在 Java 系统属性中,因此对于外部实体也是可见的,因为应用程序没有使用任何 Java 安全管理器。例如,如果应用程序(进程)在端口号 1234 上运行,我们可以运行 Java 命令:

jinfo -sysprops 1234

将这两个密码视为相应 Java 系统属性的值。我想问一下,在不过多更改现有代码库的情况下是否有任何补救措施?期望的效果是对所有外部实体“隐藏”两个 Java 系统属性(表示两个密码)。

需要注意的是,在应用程序中引入 Java 安全管理器可能不是一个解决方案,如果我们使用 Java 安全管理器撤销这两个 Java 系统属性的读取权限,读取这些属性的应用程序代码就会崩溃。同样适用于以加密形式存储密码,因为这会使应用程序中所有希望以明文形式读取密码的代码崩溃。

4

1 回答 1

1

既然你说:

...在不少于 4-5 个不同的地方...

而且您真的不想进行重大的代码更改,我会:

  1. 以加密形式提供密码。
  2. 遍历这 4-5 个地方(不是那么多!),并调用一个您必须单独编写的包装器方法:MyPassUtil.getXYZPassword()它在内部调用 System.getProperty() 以获取加密密码,解密并返回纯文本版本给调用它的人。

但请记住,通过这种方式,解密密钥和算法存储在应用程序中,一个好的 Java 反编译器(JD-GUI 或 CFR)仍会返回此信息。换句话说,任何有权访问 JAR 文件的人,仍然可以通过一些小的努力来获取信息,我认为,因为可以调用jinfo,他们也可以获取 JAR 文件。

最好的办法是使用某种形式的密钥库,同样,一旦您执行了步骤 2 中提到的包装方法,您就可以轻松实现它,而不会影响使用它的任何人。

另外,一些安全提示:

如果是 SSH / SFTP 连接,请在两台机器之间设置 SSH 密钥,并避免使用密码。

如果是数据库连接,至少将 DBMS 配置为仅允许来自该特定机器的 IP 地址的连接。如果连接是通过 Internet 并且您位于 NAT 之后,请先设置 VPN,然后通过它引导主机之间的流量。

对于其他设置,请尝试查看是否有与这两点类似的其他提示,以提高这些密码的安全性。

于 2014-10-21T05:52:19.530 回答