【Macユーザー向け】base64 デコード時にパディングがなくてエラー?解決方法まとめ
Mac のターミナルで base64 を使ってエンコード/デコードする機会は意外と多いですよね。
しかし、Linux と違って macOS の base64 コマンドには –ignore-garbage オプションがありません。
そのため、パディング(末尾の =)が省略された base64 文字列をデコードしようとすると、エラーになってしまうことがあります。
この記事では、Mac環境でパディングがない base64 を安全にデコードする方法を3つ紹介します。
問題:macOS の base64 はパディングなしに弱い
たとえば、以下のような base64 文字列をデコードしようとすると、
echo 'YWJjZA' | base64 -D
macOS では以下のようなエラーが出てしまいます。
base64: invalid input
JWT からペイロード部分を抜き出して、そこを base64 デコードして jq コマンドで JSON 文字列を解析したい。
そんな場合に、この問題によく遭遇したまま放置してました。
echo 'YWJjZA' | base64 -D | jq .data.hoge
解決策①:パディングを補ってからデコード(おすすめ)
base64 は 4文字単位で構成されるため、長さが 4 の倍数になるよう = を追加することで正常にデコードできます。
この方法は手軽で、macOS 標準の base64 コマンドでそのまま使えるのが魅力です。
base64_str="YWJjZA"
# 4の倍数にするため = を補完
padded_str=$(printf "%s" "$base64_str" | awk '{ while (length % 4 != 0) $0=$0"="; print }')
echo "$padded_str" | base64 -D
解決策②:GNU coreutils の gbase64 を使う
Linux でおなじみの –ignore-garbage オプションを使いたい場合は、Homebrew 経由で GNU coreutils をインストールしましょう。
brew install coreutils
すると、gbase64 という名前で GNU 版の base64 が使えるようになります。
echo 'YWJjZA' | gbase64 --ignore-garbage --decode
これで パディングが省略されていても問題なくデコードできます。
個人的には、この方法がオススメです。
解決策③:Python で柔軟にデコード
もしシェルスクリプトなどで複雑な処理が必要な場合は、Python を使う方法もおすすめです。
こちらも = を自動的に補ってからデコードしてくれるので安心です。
#!/usr/bin/env python3
import sys
import base64
def pad_base64(s):
"""base64文字列の長さが4の倍数になるようにパディングを追加"""
return s + '=' * ((4 - len(s) % 4) % 4)
def main():
if len(sys.argv) > 1:
# 引数からデコード対象の文字列を取得
input_str = sys.argv[1]
else:
# 標準入力から取得
input_str = sys.stdin.read().strip()
padded = pad_base64(input_str)
try:
decoded_bytes = base64.b64decode(padded)
decoded_str = decoded_bytes.decode('utf-8')
print(decoded_str)
except Exception as e:
print(f"デコードに失敗しました: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
まとめ
今回は base64 デコード時のパディングについて、以下の 3 つの方法を紹介しました。
- Mac 標準機能だけで手動で補う
- GNU coreutils の gbase64 –ignore-garbage を利用する
- Pythonスクリプトで処理
こんな場面に遭遇した方にオススメって私ですが・・・。
- API などから取得した base64 がパディングされていない
- Mac で bash スクリプトを組んでいて base64 を扱う
- Linux との挙動の違いに戸惑っている
macOS の base64 はシンプルですが、Linux のような柔軟性がないぶん、少し工夫が必要です。
本記事で紹介した方法で、パディングに関する問題をスマートに解決してみてください!