使い方
- チェックしたい文字列を入力欄に貼り付けます。
- 判定結果を確認します。有効か無効か、判別された種類(標準または URL セーフ)、デコード後のサイズが表示されます。
- 「問題点」が表示された場合は、示された位置を手がかりに、無効な文字、空白文字、位置の誤ったパディングを見つけます。
- 判別された「内容」を見て、データがテキストなのか、PNG、PDF、ZIP などのファイルなのかを確認します。
有効な Base64 の条件
- アルファベット。使用できるのは
A-Z、a-z、0-9と、ほかに 2 つの文字だけです。標準の Base64 では+と/、Base64URL では-と_を使います。両方の組み合わせが混在している文字列は、たいてい破損しているか、2 つのソースからつなぎ合わされたものです。 - パディング。
=は末尾にのみ、最大 2 つまで置けます。途中にパディングがある場合は、通常 2 つのエンコード済みの値が連結されています。 - 長さ。パディングありの場合、長さは 4 の倍数になります。パディングなしの場合は、4n + 1 以外のどの長さでも有効です。余った 1 文字には 6 ビットしか含まれず、1 バイトに足りないためです。
厳密なデコーダーでは、さらにもう 1 つのルールが加わります。最後の文字の使われない下位ビットは 0 でなければなりません。多くのデコーダーはこれらのビットを無視しますが、Go の base64.StdEncoding.Strict() のように、文字列を拒否するものもあります。
よくあるエラーと対処法
| 問題 | 主な原因 | 対処法 |
|---|---|---|
| 無効な文字 | 値と一緒にコピーされた引用符、バックスラッシュ、%2B や %3D などのエスケープ | 余分な文字を削除するか、先に URL デコードする |
| 途中にスペースがある | URL やフォームを経由した際に + がスペースに変換された | + に戻すか、URL では Base64URL を使う |
| 長さが 4n + 1 | 列の文字数制限、ログの行、コピー漏れによって値が途中で切れている | 値全体をもう一度コピーする |
| 途中にパディングがある | 2 つの Base64 文字列が連結されている | 分割してそれぞれ個別にデコードする |
| 改行 | MIME や PEM 形式の折り返し | 通常は問題なし。1 行である必要がある場合は削除する |
有効であっても意味があるとは限らない
Base64 にはヘッダーもチェックサムもないため、有効性からわかるのは、その文字列がデコード可能だということだけです。ごく普通の英単語の多くも有効と判定されます。英字が 4 文字あれば、どれでも有効なグループになるからです。そのため、この検証ツールはデータを実際にデコードし、サイズと内容の種類も表示します。読めるテキストや、PNG、PDF、ZIP などの既知のファイルシグネチャが現れれば、その文字列が本当に Base64 であるという有力な証拠になりますが、数バイトのランダムなデータでは証拠になりません。ほかのエンコード方式も調べたい場合は、エンコード判別ツールをお試しください。
コードで Base64 を検証する
// JavaScript:パディング付きの標準 Base64(空文字列にも一致します)
/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/
# Python:無効な文字を読み飛ばさずにエラーを発生させる
import base64, binascii
try:
base64.b64decode(s, validate=True)
except binascii.Error:
print('invalid')
よくある質問
普通の単語が有効な Base64 と判定されるのはなぜですか?
実際に有効だからです。適切な長さのアルファベット文字の並びであれば、何らかのバイト列にデコードされます。たとえば単語
test は 3 バイトにデコードされます。判別された内容の種類を確認してください。結果が読めるテキストでも既知のファイル形式でもなければ、入力はもともと Base64 ではなかった可能性が高いといえます。スペースや改行を含む Base64 は有効ですか?
MIME や PEM では Base64 を複数行に折り返し、ほとんどのデコーダーは空白文字を読み飛ばします。ただし、JSON のフィールド、HTTP ヘッダー、JWT、data URI では、途切れのない 1 つの文字列が必要です。この検証ツールは空白文字を別の項目として表示するため、文字列を使用する場所で問題になるかどうかを判断できます。
= のパディングがない Base64 は有効ですか?
多くの場合は有効です。Base64URL では通常パディングを省略し、RFC 4648 でも文脈から長さが分かる場合は省略が認められています。ただし、厳密なデコーダーの中にはパディングを必須とするものもあります。システムが文字列を受け付けない場合は、長さが 4 の倍数になるまで
= を追加してください。パディングなしで長さが 4n + 1 文字の文字列は、決して有効になりません。JavaScript で文字列が Base64 かどうかを確認するにはどうすればよいですか?
パディング付きの Base64 を厳密に判定するには、アルファベット 4 文字のグループの後に任意のパディングが続く形式を許可する正規表現でテストします。より手軽な方法は、
try/catch の中で atob() を呼び出すことです。ただし、atob() は不正な入力に対して InvalidCharacterError をスローする一方で、空白文字やパディングの欠落は黙って受け入れ、URL セーフの文字は受け付けない点に注意してください。