使用密码在Java中执行进程

时间:2014-04-14 17:35:13

标签: java string security memory subprocess

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

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

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

  1. 启动不使用String对象的子进程的更好方法,但是char []
  2. 确保String对象在使用后正确销毁的方法。
  3. (请注意,由于此过程如何接受命令,使用inital命令提交密码是与子流程交互的唯一方式 - 请参阅原始帖子中的Java seems to be sending carriage returns to a sub-process?评论部分)

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

    IDEA--我想知道是否有一种方法可以通过反射从字符串中获取private final char[] value并将其删除?

2 个答案:

答案 0 :(得分: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();
    }
  }

答案 1 :(得分:-1)

出于安全原因,不建议在命令行上输入密码。

如果某人有权访问您的程序以进行堆转储,那么他们可以只做一个' ps'直接命令和查看密码。我确信在Windows中存在类似的东西。

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