【发布时间】:2014-05-28 19:03:02
【问题描述】:
我有一个需要通过 Java 运行的进程,不幸的是,密码需要以纯文本形式提供给该进程。
由于事件是如此短暂,而且我们在巨大的防火墙后面工作,我实际上并不担心密码会被传输到这样的子进程。我有点担心的是 Process 和 ProcessBuilder 类只将命令作为 String 对象,而不是 char[] 数组。因此,我必须依靠垃圾收集器自行决定销毁 String 对象,从而允许有人稍后对我的程序进行堆转储并获取密码。
这是一个遥远的可能性,但我正在寻找:
- 启动子进程的更好方法,它不使用 String 对象,而是使用 char[]
- 一种确保 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