bash base64产生不一致的输出?

时间:2016-04-05 17:11:35

标签: linux bash base64

任何人都能解释一下吗?

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

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

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

3 个答案:

答案 0 :(得分:6)

比较这些

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(" =")进行基本编码   不需要或使用数据。在一般情况下,何时   无法对运输数据的大小做出假设,   填充是产生正确的解码数据所必需的。

     

实现必须在末尾包含适当的填充字符   编码数据除非参考本文件的说明书   明确说明。

     

base64和base32字母表使用填充,如下所述   第4节和第6节,但base16字母表不需要它;看到
  第8节。

答案 1 :(得分:0)

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

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

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

使用$ echo -n将允许您将字符串传递给base64而不使用尾部换行符。没有换行符的字符串编码为以" =="。

结尾的字符串

答案 2 :(得分:-1)

PHP也正确编码,这让我相信bash中的base64程序存在一些问题,因为我没有发现任何提及'o'某种方式被用作填充字符。

  

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