为什么base64输出不一致?


12

我正在lubuntu 15.04上使用基于Java的neo4j图形数据库。

neo4j HTTP身份验证标头使用'username:password'的base64编码(不包括引号)。使用wireshark,我可以看到neo4j生成的base64代码。

但是,如果我使用ubuntu coreutils base64编码相同的字符串,则会得到略有不同的编码。neo4j不接受此编码。

两种编码均解码为正确的用户名:密码字符串

用户名= neo4j和密码=@N

Neo4j给出neo4j:@Nas 的编码值,按预期bmVvNGo6QE4=解码neo4j:@N

$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N

Ubuntu coreutils base64返回neo4j:@Nas 的编码值bmVvNGo6QE4K(在最后一个字符中有所不同),但仍可以正确解码;

$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N

为什么是这样?我需要做什么来获得一致的编码?


3
请注意,=在正常情况下,Base64是填充(并且仅在末尾有效)。一个编码的字符串具有填充而另一字符串没有填充(或更普遍地说,两个字符串具有不同的填充量)这一事实是一个致命的问题,因为两者的长度不同,因此不可能完全相同。
CVn 2015年

Answers:


56

您正在(略)编码不同的字符串:

$ echo 'bmVvNGo6QE4=' | base64 --decode | od -c
0000000   n   e   o   4   j   :   @   N
0000010
$ echo 'neo4j:@N' | od -c
0000000   n   e   o   4   j   :   @   N  \n
0000011

echo添加尾随换行符。这导致不同的编码。

printf改用,其输出规范更为精确:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=

10
很好的答案,赞成。请注意,$ echo -n "neo4j:@N" | base64也可以。
Doug Smythies 2015年

7
@DougSmythies可以,但是printf比更加一致echo
muru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.