web-dev-qa-db-ja.com

base64の出力に矛盾があるのはなぜですか?

Lubuntu 15.04でJavaベースのneo4jグラフデータベースを使用しています。

Neo4j HTTP認証ヘッダーは、 'username:password'のbase64エンコードを使用します(引用符は含みません)。 wiresharkを使用すると、neo4jによって生成されたbase64コードを見ることができます。

ただし、ubuntu coreutils base64を使用して同じ文字列をエンコードすると、エンコードが少し異なります。このエンコードは、neo4jでは受け入れられません。

両方のエンコーディングは、正しいユーザー名:パスワード文字列にデコードします

ユーザー名= neo4jおよびパスワード= @N

Neo4jはneo4j:@Nのエンコードされた値をbmVvNGo6QE4=として提供し、期待どおりneo4j:@Nにデコードします

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

Ubuntu coreutils base64は、neo4j:@Nのエンコードされた値をbmVvNGo6QE4K(最後の文字が異なります)として返しますが、依然として正しくデコードします。

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

どうしてこれなの?一貫したエンコーディングを取得するには何が必要ですか?

12
Lozdown

あなたは(わずかに)異なる文字列をエンコードしています:

$ 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=
55
muru