LoginSignup
5
2

More than 1 year has passed since last update.

base64コマンド: decodeした時にエラーが出る原因と対処方法(パディングが必要)

Last updated at Posted at 2023-04-13

以下は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==
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2