我有一个需要通过Java运行的进程,不幸的是,密码需要以纯文本形式提供给进程。
由于事件是如此短暂,我们正在大规模防火墙后面工作,我实际上并不担心密码被传输到像这样的子进程。我有点担心的是Process和ProcessBuilder类只将命令作为String对象而不是char []数组。因此,我必须依靠垃圾收集器来自行决定销毁String对象,允许某人稍后可能获取我的程序的堆转储并获得密码。
这是一个遥远的可能性,但我正在寻找:
(请注意,由于此过程如何接受命令,使用inital命令提交密码是与子流程交互的唯一方式 - 请参阅原始帖子中的Java seems to be sending carriage returns to a sub-process?评论部分)
注意 - 密码不会通过命令行进入Main()函数。使用swing JPasswordField收集密码,然后写入ProcessBuilder命令数组。
IDEA--我想知道是否有一种方法可以通过反射从字符串中获取private final char[] value
并将其删除?
答案 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以允许程序以提升的权限运行其他程序。