任何人都能解释一下吗?
[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)
答案 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 ==