Base64はバイトを文字で運ぶもので、秘密を隠すものではない
Base64はテキスト用の経路でバイトデータを運ぶときに役立ちます。変わるのは表現であり、読める相手が制限されるわけでも、容量が必ず減るわけでもありません。
文字数より先にバイト数を数える
パディング付きの標準Base64は3バイトを4文字で表し、必要なら最後の組を=で埋めます。長さはバイト数を3で割って切り上げ、その後4を掛けて求めます。
UTF-8では1文字が複数バイトになることがあります。同じ文字数でも、短いアラビア語のほうがラテン文字の文より符号化後に長くなる場合があります。
参考資料: RFC 4648 — Base encodings, padding and security considerations
符号化は機密保護ではない
値を持つ人は通常、秘密の鍵なしにデコードできます。パスワードの保護や共有リンク内の情報を隠す用途にBase64を使わないでください。
出力も元データと同じ機密度で扱います。他者の読み取りを防ぐには適切な安全対策が必要で、文字の表し方を変えるだけでは足りません。
参考資料: RFC 4648 — Base encodings, padding and security considerations
戻したバイトが何のデータかを確認する
このツールはテキストをUTF-8として符号化し、有効なUTF-8テキストに戻します。符号化した画像は正しいBase64でも、このテキスト用デコーダーには不適切な場合があります。
一部のURLで使うbase64urlは標準Base64とは異なります。受け付けさせるために文字を無作為に増減せず、生成元が求める種類を確かめてください。
参考資料: RFC 4648 — Base encodings, padding and security considerations
例:文字数だけでは符号化後の長さは決まらない
Hi!はUTF-8で3バイトで、SGkhというパディングなしの4文字になります。パスワードなしに同じテキストへ戻せます。
アラビア語のمرحباは5文字ですがUTF-8で10バイトです。2YXYsdit2KjYpw==という16文字になります。長さはバイト数から決まり、2つの=は元の2文字が消えた意味ではありません。