

あなたのデータは 100% プライベートです。Base64 のエンコードとデコードはすべてお使いのデバイス上で完結します。
Base64 は、バイナリデータを 64 種類の ASCII 文字(A–Z、a–z、0–9、それに + と /)だけのプレーンテキストとして表す方法です。画像や鍵、メール添付ファイルといったバイナリを、テキスト用に作られたシステムでも安全に送れるようにします。これは暗号化ではなくエンコードです。
Base64 は 64 文字の固定されたアルファベットを使います。0 から 63 までの各値がそのうちのちょうど 1 文字に対応し、これによって任意の 3 バイトのバイナリが 4 つの読める文字になります:
| 値 | 文字 | |
|---|---|---|
| 0–25 | A–Z | 大文字 26 文字 |
| 26–51 | a–z | 小文字 26 文字 |
| 52–61 | 0–9 | 数字 10 文字 |
| 62–63 | + / | 記号 2 文字 |
「=」記号だけは例外です。これは 64 個の値の 1 つではなくパディングで、最後のブロックを埋めるためだけに使われます。
おそらくすでに目にしたことがあるはずです。Base64 は、バイナリをテキストの中に載せて運ぶ必要がある場所のいたるところで登場します:
その data URI のテクニックはこのようになります。長い文字列が画像そのものです:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />初期のネットワークプロトコルは、生のバイトではなくテキストを前提に作られていました。ASCII は 7 ビットで 128 文字を扱い、英語には十分でした が、バイナリには不向きでした。一部のシステムは制御文字を壊したり、改行コードを書き換えたり(LF を CR + LF に)して、転送中に画像や音声を静かに破損させていました。
Base64 は、どのシステムでも共通して扱える文字だけを出力することで、こうした問題をすべて回避します。Base16 や Base32 も小さなアルファベットで同じ役割を果たしますが、Base64 は安全性を保ちながら 1 文字あたりより多くのデータを詰め込めます。だからこそ広く使われるようになりました。
仕組み全体は、1 つの考え方の繰り返しです。3 バイト(24 ビット)を取り、それを 6 ビットずつ 4 つのグループに切り直し、各グループをアルファベットで引く、というものです。「Logto」という単語を手作業でエンコードしてみましょう。
ステップ 1. 各文字を 8 ビットの 2 進数にする:
| 文字 | ASCII コード | 2 進数 |
|---|---|---|
| L | 76 | 01001100 |
| o | 111 | 01101111 |
| g | 103 | 01100111 |
| t | 116 | 01110100 |
| o | 111 | 01101111 |
ステップ 2. 最初の 3 バイト「Log」を取り、その同じ 24 ビットを 6 ビットずつ 4 つのグループに切り直す:
ステップ 3. 各 6 ビットのグループを数として読み、その数をアルファベットで引く:
| 6 ビットのグループ | 値 | Base64 文字 |
|---|---|---|
| 010011 | 19 | T |
| 000110 | 6 | G |
| 111101 | 61 | 9 |
| 100111 | 39 | n |
「Logto」は 5 バイトで、3 の倍数ではありません。最後の 2 バ イト「to」は 6 + 6 + 4 に分かれます。最後の 4 ビットを 0 で埋めて 6 ビットのグループにし、「=」を 1 つ追加して 4 文字のブロックを完成させます:
ブロックをつなげると:
"Logto" → TG9ndG8=どの言語にも標準で組み込まれています。Node.js では:
const text = 'Logto';
const base64 = Buffer.from(text).toString('base64');
console.log(base64); // TG9ndG8=この手順から、覚えておく価値のある 3 つのルールが導けます:
バイナリをテキスト しか通せない経路に通す必要があるときに Base64 を使います:
見返りに得られるもの:
標準の Base64 は、URL・クエリ文字列・ファイル名の仕組みと衝突する 3 つの文字、つまり +、/、そして = によるパディングに依存しています。通常の Base64 文字列をそのままリンクに入れると、気づきにくい形で壊れることがあります:
パーセントエンコードする方法もあります(+ は %2B、/ は %2F、= は %3D)が、文字列が長くなり、誤って二重にエンコードしてしまいやすいです。
Base64URL(RFC 4648 §5)は、これを根本から解決します。+ を - に、/ を _ に置き換え、= のパディングを取り除くのです。その結果、URL・クエリパラメータ・ファイル名にそのまま、何もエスケープせずに入れられます。URL やファイル名、多くの Web API で使われています。
const base64 = 'TG9ndG8=';
const urlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
console.log(urlSafe); // TG9ndG8Base64 は表現方法であって、ただ得をする魔法ではありません。3 つのことを覚えておきましょう:
いいえ。公開されたアルファベットによる可逆的なエンコードなので、誰でも即座にデコードでき、機密性はまったく加わりません。機密データは暗号化してください。
Base64 は 3 バイトごとに 4 文字へ変換するため、エンコード後は常に元のバイトより約 3 分の 1 大きくなります。
出力を 4 文字の倍数に保つためのパディングです。「=」1 つは入力に余りが 2 バイトあったこと、「=」2 つは 1 バイトあったこと、「=」なしは長さがすでに 3 バイトの倍数だったことを意味します。
Base64URL は、URL とファイル名に安全なアルファベットを使う同 じエンコードです。- と _ が + と / の代わりになり、= のパディングは通常は省かれます。URL やファイル名、多くの Web API でよく使われます。
あらゆるバイナリが対象です。画像、PDF、鍵、実行ファイルなど。Base64 は生のバイトを扱うため、元のコンテンツの種類は問いません。
いいえ。エンコードとデコードはすべてブラウザ内で実行されます。貼り付けた内容がアップロードされたり記録されたりすることはありません。