You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java程序执行Unix加密命令异常:输出命令而非加密字符串

Java ProcessBuilder执行加密命令的问题分析

核心问题

你的代码存在两个关键错误,导致实际输出完整命令内容而非加密结果:

  1. 管道符|未被Shell解析
    ProcessBuilder默认直接执行指定程序(此处为echo),不会启动Shell处理管道符|。你把|和后续openssl命令都当成echo的参数,因此echo直接输出所有传入参数,也就是你看到的完整命令内容。

  2. 命令参数拆分错误
    你将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:30:49