base64 コマンド入門 - エンコード・デコードの基本
この記事でできるようになること
- `base64` で文字列やファイルをエンコード・デコードできる
- エンコードと暗号化とハッシュを言い分けられる
- `echo` の改行混入と `>` の上書きを避けられる
前提知識(先に読むと理解しやすい記事)
この記事でわかること
base64で 文字列やファイルをエンコード / デコード できます- エンコードと暗号化とハッシュ を言い分けられます
echoの 改行が混ざる落とし穴 を避けられます-w(折り返し)や-d(デコード)など よく使うオプション がわかります
対象読者:Linux 入門者、API トークンやメール添付で base64 文字列を見て「これは何か」と思った方
言葉の整理(ここが一番混同されます)
- エンコード:データの 書き方を変える ことです。鍵はいりません。誰でも元に戻せます。
base64はこれです。 - 暗号化:鍵を持つ人だけが元に戻せるようにすることです。鍵がなければ中身は読めません。
opensslなどが行います。 - ハッシュ:中身から短い値を作ることです。元に戻せません。同じかどうかの確認に使います。
sha256sumなどが行います。
3 つとも「見た目が変な文字列になる」点は同じです。しかし 戻せるか / 鍵がいるか が違います。この記事の base64 は「鍵なしで誰でも戻せる」種類です。
導入:リナの謎の文字列事件
SGVsbG8gV29ybGQ= みたいな謎の文字列がありました。これは何ですか。パスワードを暗号化したものですか。base64(ベースろくじゅうよん)でエンコードされた文字列だよ。でも大事なことを先に言っておく。それは 暗号化ではない んだ。base64 -d を通すだけで誰でも元に戻せる。だから秘密を守る用途には使えない。今日はその base64 の基本と、なぜ存在するのかを見ていこう。結論を先に
base64= バイナリを 64 種類の ASCII 文字だけで表現 する変換です(A-Za-z0-9+/)。末尾に付く=は長さを合わせるための詰め物です- エンコードは
base64、デコードはbase64 -dです - 暗号化ではありません。誰でもデコードできます。秘密の保護には使いません
1. base64 とは何か?
結論: base64 はバイナリデータを 64 種類の 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)まで一緒にエンコードされます。その結果、出てくる文字列が変わります。
base64 にして送ったのですが、認証が通りませんでした。文字列はコピーしたはずです。echo に -n を付けたかな。$ echo "Hello World" | base64
SGVsbG8gV29ybGQK
= から K に変わっています。目に見えない改行が原因だったんですね。echo -n か printf を使う、と決めておくといいよ。SGVsbG8gV29ybGQ= と SGVsbG8gV29ybGQK の違い
末尾が =(改行なし)か K(改行 \n を含む)かで変わります。トークンやパスワードを base64 化するとき、この改行混入は トラブルの定番 です。必ず echo -n か printf を使ってください。
# 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 が一般的です。
openssl などの出番だ。4. ファイルをエンコード・デコードする
結論: 引数にファイル名を渡せばエンコード、
-dで出力をファイルにリダイレクトすれば復元できる。
# 練習用ファイルを作る $ echo "practice" > sample.txt # ファイルをエンコードして .b64 に保存 $ base64 sample.txt > sample.txt.b64 # .b64 をデコードして別名で復元する $ base64 -d sample.txt.b64 > restored.txt
画像や証明書のようなバイナリも、まったく同じ手順で変換できます。
どこに作られるか・上書きの危険
- 新しいファイルは いま自分がいるディレクトリファイルをまとめて整理する入れ物。Windows や macOS の「フォルダ」と同じもの。 に作られます。
pwdで確認できます >は リダイレクト です。同じ名前のファイルがあれば、中身を消して上書きします- 確認は聞かれません。GUI と違い、上書きされた中身はゴミ箱にも残りません
- 上書きが怖いときは、先に
ls restored.txtで同じ名前がないか確認してください base64は本サイトの仮想ターミナル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。では動きません。実行は自分のパソコンのターミナルで行います- 練習は「7. ミニ課題」で作る、からっぽのディレクトリの中だけで行ってください。そこなら、もとからあるファイルを壊しません
diff や sha256sum で確認できるよ。一致すれば完全に復元できている証拠だ。# 元ファイルと復元ファイルが同一か確認 $ 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 規格に合わせた仕様なんだ。-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 の改行混入」「デコード時の不正文字」が三大つまずきポイント。
落とし穴 1:base64 を暗号化だと思い込む
これが一番危険です。base64 は 誰でもデコードできます。秘密情報を base64 にしただけで GitHub に上げる、ログに出す、といった事故が後を絶ちません。隠したいデータは必ず暗号化してください。
落とし穴 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
元の名前がそのまま表示されれば往復成功です。
課題 3:echo -n "test" と echo "test" をそれぞれエンコードし、結果が違う理由を 1 行で説明しよう。
ヒント 1(方向づけ)を見る
見た目には出ませんが、片方だけ最後に 1 文字ぶん多く送られています。
ヒント 2(コマンド名)を見る
echo -n "test" | base64 と echo "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 行まとめ
結論: base64 は鍵のいらない変換であり、暗号化でもハッシュでもない。誰でも元に戻せる。
base64はエンコード(書き方の変換)です。base64 -dで誰でも元に戻せます- 暗号化は鍵がいります。ハッシュは元に戻せません。base64 はそのどちらでもありません
- 文字列を渡すときは
echo -nかprintf、ファイルに書くときは>の上書きに注意します