【问题标题】:Decoding a base64 encoded random on MinGW not working在 MinGW 上解码 base64 编码的随机数不起作用
【发布时间】:2025-12-30 10:50:11
【问题描述】:

我正在尝试在 MinGW 上制作一个 bash 脚本,但似乎 shell 无法解码如下内容。

t=$(openssl rand -base64 64)
echo "$t" | base64 --decode

导致,

 Ԋ7▒%
     ▒7▒SUfX▒L:o<x▒▒䈏ţ94V▒▒▒▒uW;▒▒pxu▒base64: invalid input

有趣的是,如果我输出 base64 字符并这样运行命令,它就可以工作。

echo "+e5dcWsijZ83uR2cuKxIDJTTiwTvqB7J0EJ63paJdzGomQxw9BhfPvFTkdKP9I1o
g29pZKjUfDO8/SUNt+idWQ==" | base64 --decode

有人知道我做错了什么吗?

谢谢

【问题讨论】:

    标签: bash openssl base64 mingw git-bash


    【解决方案1】:

    我通过将--ignore-garbage 标志传递给base64 解码解决了上述情况。它会忽略非字母字符。

    echo "$t" | base64 --decode --ignore-garbage
    

    但是,我仍然想知道我是如何创建“垃圾”的;)?

    【讨论】:

      【解决方案2】:

      我认为这里发生的事情是 base64 字符串包含一些嵌入的空格,这会导致实际的“无效输入”w(以及您观察到的垃圾。)

      openssl rand -base64 64 命令引入了一些换行符(不是空格),例如,

      openssl rand -base64 64 > b64.txt
      

      ...然后在编辑器中查看 b64.txt 文件,我看到两条单独的行

      tPKqKPbH5LkGu13KR6zDdJOBpUGD4pAqS6wKGS32EOyJaK0AmTG4da3fDuOI4T+k
      abInqlQcH5k7k9ZVEzv8FA==
      

      ...这意味着'k'和'a'之间有一个换行符

      所以 base64 字符串有这个嵌入的换行符。 base64 -d 可以处理换行符(如您的成功示例所示),但它不能处理空格字符。

      shell 的某些操作可以将换行符转换为空格。 echo $t 即很可能发生这种情况。如果 t 里面有换行符,那么 echo 将用单个空格替换 then。实际上,它的行为方式可能取决于 shell 选项和应用的字符串引号类型(如果有)。

      要修复该命令,我们可以在传递给base64 -d 命令之前删除换行符。

      一种方法是使用tr 命令,例如以下适用于 Linux:

      t=$(openssl rand -base64 64 | tr -d '\n')
      echo $t | base64 -d
      

      ... 或者,删除空格,再次使用tr

      t=$(openssl rand -base64 64)
      echo $t | tr -d ' ' | base64 -d
      

      【讨论】:

      • 我明白了。但是当我执行 `echo "......" | base64 --decode" 也是?
      • @Starx ...你说得对,我澄清了答案,以突出换行符和空格字符的区别
      • 感谢您的更新,但我仍然在 MinGW 上得到相同的输出。