Java程序执行Unix加密命令异常:输出命令而非加密字符串
Java ProcessBuilder执行加密命令的问题分析
核心问题
你的代码存在两个关键错误,导致实际输出完整命令内容而非加密结果:
管道符
|未被Shell解析
ProcessBuilder默认直接执行指定程序(此处为echo),不会启动Shell处理管道符|。你把|和后续openssl命令都当成echo的参数,因此echo直接输出所有传入参数,也就是你看到的完整命令内容。命令参数拆分错误
你将openssl enc -aes-256-cbc -k作为单个参数传入,不符合ProcessBuilder的参数规则。每个命令、选项、参数都需要拆分为独立字符串元素,比如openssl、enc、-aes-256-cbc、-k都应是单独的参数项。
修正方案
有两种可行的修正方式:
方式一:通过Shell执行完整命令
直接启动Shell(如/bin/sh),将整个管道命令作为-c选项的参数传入,让Shell解析管道和命令:
import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException, InterruptedException { String key = "1234567812345678"; String iv = "1234567812345678"; String string = "passwordToBeEncrypted"; // 构造完整Shell命令,注意转义引号 String shellCommand = String.format("echo \"%s\" | openssl enc -aes-256-cbc -k \"%s\" -iv \"%s\" -base64", string, key, iv); ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", shellCommand); Process p = pb.start(); int exitCode = p.waitFor(); System.out.println("Exit code: " + exitCode); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String encryptedString = reader.readLine(); System.out.println("Encrypted string: " + encryptedString); } }
方式二:不使用管道,直接传递输入给openssl(更安全,避免Shell注入)
通过ProcessBuilder的输入流将字符串直接传给openssl,无需启动Shell,也规避了管道问题:
import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Main { public static void main(String[] args) throws IOException, InterruptedException { String key = "1234567812345678"; String iv = "1234567812345678"; String string = "passwordToBeEncrypted"; // 正确拆分openssl的所有参数 ProcessBuilder pb = new ProcessBuilder("openssl", "enc", "-aes-256-cbc", "-k", key, "-iv", iv, "-base64"); Process p = pb.start(); // 将需要加密的字符串写入openssl的输入流 try (OutputStreamWriter writer = new OutputStreamWriter(p.getOutputStream())) { writer.write(string); } int exitCode = p.waitFor(); System.out.println("Exit code: " + exitCode); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String encryptedString = reader.readLine(); System.out.println("Encrypted string: " + encryptedString); } }
注意:方式二更推荐,它避免了Shell命令注入风险,尤其是输入字符串包含特殊字符时,无需担心转义问题。
内容的提问来源于stack exchange,提问作者user3348838
相关产品推荐
相关产品推荐

