如何安全地处理敏感的环境变量?

How to safely handle sensitive environment variables?

我开发了一个 Java 应用程序,它将 shell 脚本作为输入参数并执行它。我正在使用以下块来准备环境:

ProcessBuilder pb = new ProcessBuilder("/bin/bash", scriptFile);
Map<String, String> env = pb.environment();

env.putAll(environmentVariable);

Process awk = pb.inheritIO().start();
awk.waitFor();
awk.destroy();

在上面的代码块中,environmentVariable 是一个 Map,其中包含一些稍后将被脚本使用的敏感数据。

我对ProcessBuilder#environment()的理解是它只为那个子进程提供环境。您对该环境所做的更改仅影响该子流程。我已经通过 ProcessBuilder#environment()

的 Javadoc 进行了验证

现在我的问题是,在此操作结束时,即调用 awk.destroy() 时,环境是否会与我放置的所有敏感变量一起擦除,还是手动擦除更好环境变量映射 env.remove(SENSITIVE_VARIABLE_KEY)env.putAll(new HashMap<String, String>)

process.destroy 不会清理 ProcessBuilder 上的系统环境。您仍然可以使用相同的 PB 对象来启动新进程,以及使用相同的环境映射。

我不明白您的要求,为什么要删除 env 条目。如果在 awk 过程之后,您不再使用 pb 对象,并且没有对它的引用,java 将对其进行垃圾回收。我看不出从地图中删除敏感条目会给您带来什么。无论如何,您还有另一个 java 变量 environmentVariable 保存您的敏感数据。

对于你的问题,如果你想删除一些数据,你可以使用map.remove(),如果你想清理地图,你可以使用pb.environment().clear()。但是如果你这样做了,当你用 pb 启动一个新进程时,它将使用修改后的 env-map。