在 MinGW 上解码 base64 编码的随机数不起作用

Posted

技术标签:

【中文标题】在 MinGW 上解码 base64 编码的随机数不起作用【英文标题】:Decoding a base64 encoded random on MinGW not working 【发布时间】:2020-02-28 17:21:43 【问题描述】:

我正在尝试在 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

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

谢谢

【问题讨论】:

【参考方案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 上得到相同的输出。

以上是关于在 MinGW 上解码 base64 编码的随机数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java Base64 编码解码方案总结

Swift 中的 Base64 编码不会在 Android 中解码

base64无法解码pb+

Base64编解码是什么?

C语言应用——Base64编码/解码

C语言应用——Base64编码/解码