【问题标题】:Executing a process in Java with a password使用密码在 Java 中执行进程
【发布时间】:2014-05-28 19:03:02
【问题描述】:

我有一个需要通过 Java 运行的进程,不幸的是,密码需要以纯文本形式提供给该进程。

由于事件是如此短暂,而且我们在巨大的防火墙后面工作,我实际上并不担心密码会被传输到这样的子进程。我有点担心的是 Process 和 ProcessBuilder 类只将命令作为 String 对象,而不是 char[] 数组。因此,我必须依靠垃圾收集器自行决定销毁 String 对象,从而允许有人稍后对我的程序进行堆转储并获取密码。

这是一个遥远的可能性,但我正在寻找:

  1. 启动子进程的更好方法,它不使用 String 对象,而是使用 char[]
  2. 一种确保 String 对象在使用后被正确销毁的方法。

(请注意,由于该进程如何接受命令,因此使用初始命令提交密码是与子进程交互的唯一方法——请参阅:Java seems to be sending carriage returns to a sub-process? cmets 原始帖子部分)

注意- 密码不会通过命令行传递给 Main() 函数。使用 swing JPasswordField 收集密码,然后写入 ProcessBuilder 命令数组。

IDEA--不知道有没有办法通过反射从字符串中获取private final char[] value并擦除它?

【问题讨论】:

  • 如果您在防火墙后面,为什么还要担心“某人”会进行堆转储?
  • 如果您担心堆转储,为什么不担心进程列表?
  • 这是一个很好的问题——我想我想尽可能多地覆盖我的基地,即使风险非常低。我想这是对内部特工的保护?
  • 我承认,有几个纳秒到微秒的窗口,攻击者可以通过堆转储查看密码。我希望不是这样,我想知道安全专家如何处理这样的利弊。正如我在另一条评论中提到的,在某些时候所有密码都是明文,即使在散列过程中也是如此。

标签: java string security memory subprocess


【解决方案1】:

我追求我的想法,即使用反射手动擦除 String.value 参数作为对象破坏的一种手段。我想它会到期的!

  private void destroyMe(String destroyMe) {
    try {
      int len = destroyMe.length();
      Field f = destroyMe.getClass().getDeclaredField("value");
      f.setAccessible(true);
      char[] stars = new char[len];
      Arrays.fill(stars, '*');
      f.set(destroyMe, stars);
      f.setAccessible(false);
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    }
  }

【讨论】:

    【解决方案2】:

    出于安全原因,不鼓励在命令行中输入密码。

    如果有人可以访问您的程序进行堆转储,那么他们可以改为执行“ps”命令并直接查看密码。我确信 Windows 中存在类似的东西。

    如果您在 linux 系统上运行,您可以考虑配置 sudo 以允许您的程序以提升的权限运行其他程序。

    【讨论】:

    • 我已经在我的帖子中解决了这个问题...只要我可以销毁包含密码的数组,我并不担心。密码总是必须在某些时候变成纯文本。即使你混淆或散列,明文字母也必须先进入你的散列函数。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多