2014-10-30 83 views
0

我正尝试从我的Java程序与外部控制台应用程序进行通信,并且我需要将密码传递给它。通过ProcessBuilder传递合理的数据

我的问题是,在ProcessBuilder()参数列表中传递纯文本密码是安全的吗?我的意思是,有人可以拦截该消息?什么会是一个更安全的方式来实现呢?

谢谢

ArrayList<String> lstArgs = new ArrayList<String>();   
lstArgs.add("program.exe"); 
lstArgs.add("password");  

ProcessBuilder pb = new ProcessBuilder(lstArgs); 
pb.start(); 
+0

我想如果你的密码是硬编码的,就像你的例子,有人可以将它从你的程序的字节码中提取出来。 – azurefrog 2014-10-30 20:34:20

+0

*“是,在ProcessBuilder中以纯文本传递密码是安全的()”* - 否,但是您有什么选择......另外,在Windows上,可以真正确定传递的参数到一个进程...使其更加安全...... – MadProgrammer 2014-10-30 20:34:43

+0

任何能够从命令中读取密码的人都可以首先从您的进程中读取字符串。 – SLaks 2014-10-30 20:39:06

回答

2

不,它不是固定在明文密码传递给另一个进程。并且绝对不安全以将其作为命令行参数传递 - 普通用户可以在没有任何特殊权限的情况下读取命令行参数(例如,ps或top或Windows中的等效项的输出)。

最后,避免在字符串变量中捕获和保存密码。使用一组字符,并在您不再需要时立即覆盖内容。 String的问题在于,您无法控制何时回收内存,并且无法覆盖内容(字符串是不可变的)。

什么是更好的方法来做到这一点?如何为program.exe创建编程接口(API),并通过调用或套接字传递信息。如何将密码传递给用户唯一可读的文件并给出该文件的名称或句柄。

如果您不能更改program.exe,那么您将被迫使用不安全的方法。