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


12

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:@Nas bmVvNGo6QE4K(最後の文字が異なります)を返しますが、正しくデコードします。

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

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


3
=通常のBase64ではパディングが行われることに注意してください(最後にのみ有効です)。1つのエンコードされた文字列にパディングがあり、他の文字列にはパディングがない(または、より一般的には、2つの文字列のパディング量が異なる)という事実は、2つの文字列の長さ異なるため、同一ではない可能性があるという事実です。
CVn

回答:


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も動作することに注意してください。
ダグスミティーズ

7
@DougSmythiesはそれを行いますが、printfよりもずっと一貫していechoます。
ムル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.