bash base64 产生不一致的输出?

bash base64 producing inconsistent output?

谁能解释一下?

[vagrant@centos ~]$ echo "10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm" | base64
MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQo=
[vagrant@centos ~]$ echo "MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQ==" | base64 -d
10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm

第一个字符串在末尾用 o= 编码,但在末尾用 == 编码的字符串解码为相同的原始字符串...

GNU bash,版本 4.1.2(1)-发布 (x86_64-redhat-linux-gnu)

比较这些

echo "10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm" | base64 | od -c
echo "MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQ==" | base64 -D | od -c
echo "MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQo=" | base64 -D | od -c

如果我们在使用 echo 时不发送换行符 o 丢失,看看这个...

echo -n "10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm" | base64

正在编码的换行符在 o=

中给出了 o

= 是填充,它可能并不总是存在。看看这里..

https://en.wikipedia.org/wiki/Base64#Padding

不同的实现也可能使用不同的填充字符。你可以在这里看到一些差异

https://en.wikipedia.org/wiki/Base64#Variants_summary_table

来自RFC

3.2. Padding of Encoded Data

In some circumstances, the use of padding ("=") in base-encoded data is not required or used. In the general case, when assumptions about the size of transported data cannot be made, padding is required to yield correct decoded data.

Implementations MUST include appropriate pad characters at the end of encoded data unless the specification referring to this document explicitly states otherwise.

The base64 and base32 alphabets use padding, as described below in sections 4 and 6, but the base16 alphabet does not need it; see
section 8.

PHP 也对其进行了正确的编码,这让我相信 bash 中的 base64 程序存在一些问题,因为我没有发现任何关于 'o' 的提及用作填充字符。

php > echo base64_encode("10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm"); MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQ==

当您使用 $echo 时,换行符会附加到输出的末尾。这个换行符是 base64 编码的一部分。当您将 'o' 更改为“=”时,您正在更改换行符的编码。在这种情况下,它解码的字符仍然不是可打印字符。

在我的终端中,解码这两个字符串会产生相同的输出,但以 "o=" 结尾的字符串有一个换行符,而以“==”结尾的字符串没有。

$> echo "MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQo=" | base64 -d
10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm
$> echo "MTBJWHlkcmRzYzREVkFneHpyWGxkTnc1R01lVkFIS0c6VEFPMDRKdVd6NFBCVldZbQ==" | base64 -d
10IXydrdsc4DVAgxzrXldNw5GMeVAHKG:TAO04JuWz4PBVWYm $>

使用 $echo -n 将允许您将字符串传递到 base64 中而无需尾随换行符。没有换行符的字符串编码为以“==”结尾的字符串。