为什么 base64 输出不一致?

Loz*_*own 13 command-line password neo4j

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

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

但是,如果我使用 ubuntu coreutils base64 对相同的字符串进行编码,则会得到稍微不同的编码。这种编码不被neo4j 接受。

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

例子

用户名=neo4j和密码=@N

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

$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N
Run Code Online (Sandbox Code Playgroud)

Ubuntu coreutilsbase64返回neo4j:@Nas的编码值bmVvNGo6QE4K(与最后一个字符不同)但仍能正确解码;

$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N
Run Code Online (Sandbox Code Playgroud)

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

mur*_*uru 58

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,赞成。注意`$ echo -n "neo4j:@N" | base64` 也有效。 (10认同)
  • @DougSmythies 确实如此,但是 [`printf` 比 `echo` 更加一致](http://unix.stackexchange.com/q/65803/70524)。 (7认同)