base64 コマンド入門 - エンコード・デコードの基本

base64 コマンド入門 - エンコード・デコードの基本

この記事でできるようになること

  • `base64` で文字列やファイルをエンコード・デコードできる
  • エンコードと暗号化とハッシュを言い分けられる
  • `echo` の改行混入と `>` の上書きを避けられる

前提知識(先に読むと理解しやすい記事)

この記事でわかること

  • base64文字列やファイルをエンコード / デコード できます
  • エンコードと暗号化とハッシュ を言い分けられます
  • echo改行が混ざる落とし穴 を避けられます
  • -w(折り返し)や -d(デコード)など よく使うオプション がわかります

対象読者:Linux 入門者、API トークンやメール添付で base64 文字列を見て「これは何か」と思った方

言葉の整理(ここが一番混同されます)

  • エンコード:データの 書き方を変える ことです。鍵はいりません。誰でも元に戻せます。base64 はこれです。
  • 暗号化:鍵を持つ人だけが元に戻せるようにすることです。鍵がなければ中身は読めません。openssl などが行います。
  • ハッシュ:中身から短い値を作ることです。元に戻せません。同じかどうかの確認に使います。sha256sum などが行います。

3 つとも「見た目が変な文字列になる」点は同じです。しかし 戻せるか / 鍵がいるか が違います。この記事の base64 は「鍵なしで誰でも戻せる」種類です。

導入:リナの謎の文字列事件

リナ: ライニー先輩、設定ファイルに SGVsbG8gV29ybGQ= みたいな謎の文字列がありました。これは何ですか。パスワードを暗号化したものですか。
ライニー先輩: いいところに気づいたね。それは base64(ベースろくじゅうよん)でエンコードされた文字列だよ。でも大事なことを先に言っておく。それは 暗号化ではない んだ。
リナ: 暗号化ではない。では中身は読めてしまうのですか。
ライニー先輩: そう。base64 -d を通すだけで誰でも元に戻せる。だから秘密を守る用途には使えない。今日はその base64 の基本と、なぜ存在するのかを見ていこう。

結論を先に

  • base64 = バイナリを 64 種類の ASCII 文字だけで表現 する変換です(A-Z a-z 0-9 + /)。末尾に付く = は長さを合わせるための詰め物です
  • エンコードは base64、デコードは base64 -d です
  • 暗号化ではありません。誰でもデコードできます。秘密の保護には使いません

1. base64 とは何か?

結論: base64 はバイナリデータを 64 種類の ASCII 文字に変換する方式。暗号化ではなく「運搬用の包装」。

リナ: そもそも、なぜこの変換が必要なのですか。
ライニー先輩: いい質問。メールや一部のプロトコルは テキスト(ASCII 文字)しか安全に運べない ことがあるんだ。画像のようなバイナリをそのまま流すと、途中で壊れることがある。
リナ: 文字に変換しておけば安全に運べる、ということですね。
ライニー先輩: その通り。base64どんなデータでも 64 種類の文字だけで表現 する。だから「暗号」ではなく「運搬用の包装」だと思うといい。中身は隠れないけれど、安全に運べる形になる。

base64 が使われる場所

  • メールの添付ファイル(MIME)
  • HTTP の Basic 認証ヘッダー
  • 設定ファイル・JSON に埋め込むバイナリ(画像・証明書など)
  • data: URL(HTML に画像を直接埋め込む)

2. 文字列をエンコードしてみる

結論: echo -n でパイプして base64 に渡す。-n を付けないと末尾の改行まで一緒にエンコードされる。

ライニー先輩: まずは文字列を実際にエンコードしてみよう。Hello World を変換するよ。
リナ: パイプ(|)で base64 に渡すのですね。
$ echo -n "Hello World" | base64
SGVsbG8gV29ybGQ=

echo -n-n を忘れない

echo はデフォルトで 末尾に改行を付けます-n なしだと改行 1 文字(\n)まで一緒にエンコードされます。その結果、出てくる文字列が変わります。

リナ: 先輩、API のトークンを base64 にして送ったのですが、認証が通りませんでした。文字列はコピーしたはずです。
ライニー先輩: echo-n を付けたかな。
リナ: 付けていません。改行が 1 文字だけ増えると、そんなに変わるものですか。
ライニー先輩: 変わるよ。実際に見比べてみよう。最後の数文字が別物になっているはずだ。
$ echo "Hello World" | base64
SGVsbG8gV29ybGQK
リナ: 本当だ。末尾が = から K に変わっています。目に見えない改行が原因だったんですね。
ライニー先輩: そう。見えない 1 文字が別のデータを作る。だからトークンを扱うときは echo -nprintf を使う、と決めておくといいよ。

SGVsbG8gV29ybGQ=SGVsbG8gV29ybGQK の違い

末尾が =(改行なし)か K(改行 \n を含む)かで変わります。トークンやパスワードを base64 化するとき、この改行混入は トラブルの定番 です。必ず echo -nprintf を使ってください。

# printf は改行を付けないので -n の付け忘れを防げる
$ printf '%s' "Hello World" | base64

3. デコードしてみる

結論: base64 -d(または --decode)で元に戻す。誰でも実行できるので秘密保護にはならない。

ライニー先輩: 次は逆。さっきの SGVsbG8gV29ybGQ= を元に戻してみよう。-d を付けるだけだよ。
リナ: デコードには特別な鍵はいらないのですか。
ライニー先輩: いらない。だからこそ「暗号化ではない」と最初に言ったんだ。手元にコマンドさえあれば、誰でも中身が見える。
$ echo "SGVsbG8gV29ybGQ=" | base64 -d
Hello World

-d--decode は同じ

base64 -d でも base64 --decode でも動きます。短い -d が一般的です。

リナ: 冒頭の設定ファイルの謎の文字列も、これで中身が読めるということですか。
ライニー先輩: そういうこと。だから API キーやパスワードを base64 にしただけで「隠した」と思ってはいけない。隠したいなら暗号化が必要だよ。鍵を使う openssl などの出番だ。

4. ファイルをエンコード・デコードする

結論: 引数にファイル名を渡せばエンコード、-d で出力をファイルにリダイレクトすれば復元できる。

ライニー先輩: 文字列だけでなく、ファイルもそのまま渡せる。まずは練習用のファイルを 1 つ作ろう。
# 練習用ファイルを作る
$ echo "practice" > sample.txt

# ファイルをエンコードして .b64 に保存
$ base64 sample.txt > sample.txt.b64

# .b64 をデコードして別名で復元する
$ base64 -d sample.txt.b64 > restored.txt

画像や証明書のようなバイナリも、まったく同じ手順で変換できます。

どこに作られるか・上書きの危険

リナ: 戻したファイルは、本当に元と同じですか。
ライニー先輩: いい着眼点。diffsha256sum で確認できるよ。一致すれば完全に復元できている証拠だ。
# 元ファイルと復元ファイルが同一か確認
$ diff sample.txt restored.txt && echo "OK: 完全一致"
OK: 完全一致

サイズは約 1.33 倍に増えます

base64 は 3 バイトを 4 文字に変換します。そのためエンコード後は 元の約 4/3(約 33% 増) のサイズになります。容量に余裕がない場所で大きいファイルを base64 化するときは注意してください。

5. 折り返し(改行)を制御する -w

結論: base64 は既定で 76 文字ごとに改行を入れる。1 行にしたいなら -w 0 を使う。

リナ: 長いファイルをエンコードしたら、途中で何回も改行されていました。これは普通ですか。
ライニー先輩: 普通だよ。base64デフォルトで 76 文字ごとに改行(折り返し) を入れる。メールの MIME 規格に合わせた仕様なんだ。
リナ: でも 1 行で欲しいときもあります。トークンを 1 行で扱いたいときとか。
ライニー先輩: そのときは -w 0-w は wrap(折り返し)で、0 を指定すると 折り返しなし になるよ。
# 折り返しなし(1 行で出力)
$ base64 -w 0 image.png > oneline.b64

# 40 文字ごとに折り返す
$ echo -n "Hello World, this is a longer text" | base64 -w 40

macOS の base64 には -w がありません

-w は GNU coreutils(Linux 標準)のオプションです。macOS(BSD 版)の base64 には -w がなく、折り返しの指定方法が異なります。この記事は Linux(GNU coreutils) を前提にしています。

6. よくある落とし穴

結論: 「暗号化と勘違い」「echo の改行混入」「デコード時の不正文字」が三大つまずきポイント。

ライニー先輩: 最後に、初心者がハマりやすいポイントを 3 つまとめておくね。

落とし穴 2:echo の改行混入

2 章 で見た通り、echo -n を忘れると改行までエンコードされます。トークンを base64 化したのに認証が通らないときは、まずこれを疑ってください。

落とし穴 3:デコード時の invalid input

コピペでスペースや余計な文字が混ざると base64: invalid input が出ます。base64 が使う文字は A-Z a-z 0-9 + / の 64 種類だけと決まっており、それ以外が入るとエラーになるからです。

-i--ignore-garbage)を付けると、この 64 種類以外の文字を読み飛ばして デコードを続けます。

# 改行やスペースが混ざっていても無視してデコード
$ base64 -d -i messy.b64

安全テンプレ(コピペ用)

# 文字列をエンコード(改行を入れない)
printf '%s' "テキスト" | base64

# 1 行でエンコード(折り返しなし)
base64 -w 0 file.bin

# デコード
echo "SGVsbG8=" | base64 -d

7. ミニ課題:自分の環境で試そう

結論: エンコード・往復確認・改行の違いの 3 問で base64 の挙動を体に覚えさせる。

ライニー先輩: 知識を定着させるために、自分の環境で次の課題をやってみよう。

練習用のからっぽのディレクトリを作り、その中で試します。こうすれば、もとからあるファイルを上書きしません。

# 練習用ディレクトリを準備して移動する
$ mkdir -p ~/base64-practice && cd ~/base64-practice

課題 1:自分の名前を base64 でエンコードしよう。末尾に改行を入れないこと。

ヒント 1(方向づけ)を見る

文字を画面に出すコマンドの出力を、パイプで渡します。改行を付けない書き方を選んでください。

ヒント 2(コマンド名)を見る

printf '%s' または echo -n を使い、base64 にパイプします。

答えを見る
$ printf '%s' "Lina" | base64
TGluYQ==

printf '%s'echo -n を使えば、末尾の改行が混ざりません。

課題 2:課題 1 の結果をデコードし、元に戻ることを確認しよう。

ヒント 1(方向づけ)を見る

エンコードと同じコマンドに、逆向きを指示するオプションを 1 つ足します。

ヒント 2(コマンド名)を見る

base64 -d を使います。

答えを見る
$ echo "TGluYQ==" | base64 -d
Lina

元の名前がそのまま表示されれば往復成功です。

課題 3echo -n "test"echo "test" をそれぞれエンコードし、結果が違う理由を 1 行で説明しよう。

ヒント 1(方向づけ)を見る

見た目には出ませんが、片方だけ最後に 1 文字ぶん多く送られています。

ヒント 2(コマンド名)を見る

echo -n "test" | base64echo "test" | base64 を実行し、出力を見比べます。

答えを見る
$ echo -n "test" | base64
$ echo "test" | base64
dGVzdA==
dGVzdAo=

echo はデフォルトで末尾に改行(\n)を付けます。echo "test"test\n(5 バイト)、echo -n "test"test(4 バイト)をエンコードします。入力が違うので、結果の base64 文字列も違います。

振り返り

結論: base64 は隠す道具ではなく、安全に運ぶための包み方である。鍵の有無と戻せるかで暗号化・ハッシュと分ける。

リナ: やっと整理できました。base64 は隠す道具ではなくて、運ぶための包み方なんですね。
ライニー先輩: その通り。鍵がいるのが暗号化、戻せないのがハッシュ、誰でも戻せるのがエンコード。この 3 つを言い分けられれば十分だよ。
リナ: 設定ファイルの謎の文字列も、もう怖くありません。あれをパスワード置き場にしてはいけない理由もわかりました。

今日の 3 行まとめ

結論: base64 は鍵のいらない変換であり、暗号化でもハッシュでもない。誰でも元に戻せる。

  1. base64 はエンコード(書き方の変換)です。base64 -d で誰でも元に戻せます
  2. 暗号化は鍵がいります。ハッシュは元に戻せません。base64 はそのどちらでもありません
  3. 文字列を渡すときは echo -nprintf、ファイルに書くときは > の上書きに注意します

次に読む

この記事を共有

次の一手