以下はLinux(CentOS7)での実行結果。
base64デコード時のエラー
base64: invalid input
というエラーが出る。
エラーが出力される例
$ str=eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
$ echo -n ${str} | base64 -d
{"sub":"1234567890","name":"John Doe","iat":1516239022}base64: invalid input
対処方法
原因は、パディング(=
で適切な長さに埋める作業)が実施されていないから。対処方法の一例はここに書いてあったが、パディングしてからdecodeすること。
成功例
$ str=eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
$ echo -n ${str}==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 -d
{"sub":"1234567890","name":"John Doe","iat":1516239022}
補足
なお、厳密にはechoコマンドはデフォルトで行末に改行コードが入るので、利用する際には-n
オプションを使うか、printfコマンドを利用した方が良い。
行末に改行コードが入る時と、入らない時とではbase64エンコードの結果も異なる。
echoコマンド。行末に改行コードが入る。
$ echo '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | od -c
0000000 { " s u b " : " 1 2 3 4 5 6 7 8
0000020 9 0 " , " n a m e " : " J o h n
0000040 D o e " , " i a t " : 1 5 1 6
0000060 2 3 9 0 2 2 } \n
0000070
$ echo '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | base64
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQo=
echoコマンドに-nオプションを付けた場合。行末に改行コードが入らない。
$ echo -n '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | od -c
0000000 { " s u b " : " 1 2 3 4 5 6 7 8
0000020 9 0 " , " n a m e " : " J o h n
0000040 D o e " , " i a t " : 1 5 1 6
0000060 2 3 9 0 2 2 }
0000067
$ echo -n '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | base64
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ==
printfコマンド。行末に改行コードが入らない。
$ printf '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | od -c
0000000 { " s u b " : " 1 2 3 4 5 6 7 8
0000020 9 0 " , " n a m e " : " J o h n
0000040 D o e " , " i a t " : 1 5 1 6
0000060 2 3 9 0 2 2 }
0000067
$ printf '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | base64
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ==