【问题标题】:How to "hide" sensitive system properties like passwords set by Java applications?如何“隐藏”敏感的系统属性,如 Java 应用程序设置的密码?
【发布时间】:2014-10-21 05:41:42
【问题描述】:

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

jinfo -sysprops 1234

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

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

【问题讨论】:

    标签: java security properties system java-security-manager


    【解决方案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,然后通过它引导主机之间的流量。

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

    【讨论】:

    • 感谢您的快速回复!为了给您更多的上下文,我们作为 Java 系统属性存储的上述两个密码实际上是访问两个密钥库的密码,而 Tomcat 要求我们以纯文本格式存储上述两个密码。鉴于此,您能否建议任何其他解决方法,以便只有 Tomcat 能够按原样查看这两个密码,而所有其他外部实体都看不到它们?
    • 我明白了。归根结底,必须将解密密钥放在某个地方。如果我正确理解您的场景,您正在使用 Tomcat 配置将密码添加到应用程序的系统属性中,之后 Java 应用程序获取这些密码并解锁密钥库。我只能看到两个选项: 1. 加密密码并在 java 应用程序中解密它们,如上一条评论中所述。 2.在(应用程序的)启动过程中,要求以交互方式输入密码(手动输入)。这样,密码只在运行时存储在 RAM 中
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2018-12-13
    • 2011-07-09
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多