base64 -d デコードが入力が無効であることを示します。

base64 -d デコードが入力が無効であることを示します。

なぜこれが起こり、解決策を知っている人がいますか?

me@box:~$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ" | base64 -di
{"foo":"bar","baz":"bat"}base64: invalid input

答え1

逆にすると、文字列が不完全であることがわかります。

$ echo '{"foo":"bar","baz":"bat"}' | base64
eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=" | base64 -di
{"foo":"bar","baz":"bat"}

抜粋入力長を3で割ることができない場合base64エンコーディングにパディングが必要なのはなぜですか?

フィラー文字とは何ですか?

パディング文字は長さの要件を満たすのに役立ちますが、意味はありません。

ただし、パディングは、非常に単純なネットワークプロトコルで発生する可能性があるように、Base64でエンコードされた文字列が個々のシーケンスの長さが失われるように接続される状況で役立ちます。

埋められていない文字列を連結すると、個々のシーケンスの終わりにある奇数バイトに関する情報が失われるため、元のデータを回復できません。ただし、パディングシーケンスを使用すると、あいまいさがなく、シーケンス全体を正確にデコードできます。

答え2

コマンドラインツールは、入力長が4の倍数になるように適切なパディング文字数を選択します。文字列の長さは34文字なので、=最後にパディングとして2つの記号が必要です。

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}

入力にパディング文字がない場合、結果は実装によって異なります。正しいBase64エンコーディングabcdは次のとおりですYWJjZA==

% echo -n abcd |base64
YWJjZA==

パディング文字を削除してデコードしようとすると、最後の部分は次のようになります。静かに落ちるMacの場合:

% echo 'YWJjZA' |base64 -d
abc

GNU 実装では、出力全体が表示されますが、stderr にエラーメッセージが表示されます。

$ echo 'YWJjZA' |base64 -d
abcdbase64: invalid input

答え3

GNUではbase64 -d適切なパディングが必要です(入力長は4の倍数でなければなりません)。他のbase64デコーダはよりスマートであり、パディングは必要ありません(たとえば、Mac / BSDはbase64 -Dパディングを必要としません)。

以下は、文字列を自動的に正しく埋めるbashコマンドですbase64。これにより、「無効な入力」エラーは発生しません。

str="eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ"

echo "$str"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode

説明する:

  • echo "$str"====4つの等号を追加してください。
  • fold -w 44文字ごとに別々の行に分割
  • sed '$ d'最後の行を削除する(無関係のパディング)
  • tr -d '\n'すべての行をリンク

関連情報