メールの中身を表示させたら、意味の読めない英数字が延々と続いていた。あるいはHTMLに「data:image/png;base64,」で始まる長い文字列があった。あれが何をしているのかを説明します。
長い英数字を貼り付ければ、その場で元のデータに戻せます。仕組みの説明は、必要になったら読んでください。
コンピュータが扱うデータには、大きく分けて2種類あります。文章のように文字として読めるものと、画像や動画のように文字ではないものです。
問題は、世の中の仕組みの一部が文字しか運べない前提で作られていることです。電子メールがその代表で、もともとは文章をやり取りするために設計されました。画像をそのまま流し込むと、途中の機器が誤って解釈したり、特定の並びを制御用の合図と勘違いしたりします。
そこで、文字ではないデータを安全な文字だけで表し直す方法が必要になりました。それがBase64です。名前のとおり64種類の文字を使います。英字の大文字26種、小文字26種、数字10種、そして記号2種。合計64です。
これらはどの環境でも同じ意味で扱われる、素性のはっきりした文字です。だから途中で壊れません。
元のデータは、1つの単位で256通りを表せます。一方Base64は64種類しか使えません。そのままでは収まりません。
そこで、元のデータ3つぶんをまとめて、4文字に割り当て直します。3が4になるので、およそ1.33倍。これが容量の増える理由です。
| 元のデータ | Base64にした後 |
|---|---|
| 3単位 | 4文字 |
| 3メガバイト | 約4メガバイト |
| 19メガバイトの添付 | 約25メガバイト |
この増加は実務に影響します。メールの添付には送信サイズの上限があり、多くの場合25メガバイト前後です。これは包装した後の大きさに対する制限なので、実際に添付できるファイルは19メガバイト前後が目安になります。「20メガのファイルなのに送れない」という現象は、たいていこれが原因です。
Base64の文字列は、データの長さによっては末尾に = が付きます。これは長さの調整です。3つずつの組にしたとき、最後に1つか2つ余ると4文字の形が作れません。足りないぶんを = で埋めています。
余りが1つなら = が2つ、2つなら = が1つ。だから = は多くても2つです。3つ以上並んでいたら、その文字列はどこかで壊れています。なお = は飾りではなく、消すと復元できなくなることがあります。
添付ファイルは送信時にBase64へ変換され、受信側で元に戻されます。普段は意識する必要がありません。メールの中身をそのまま表示させたときに現れる長い英数字が、この変換後の姿です。
「data:image/png;base64,」で始まる書き方は、画像ファイルを別に置かず、文書の中に直接書き込む方法です。利点と欠点がはっきり分かれます。
目安として、数キロバイト程度の小さなアイコンには向き、写真のような大きい画像には向きません。埋め込む前に画像そのものを軽くしておくと、この判断が楽になります。
改行や記号を含むデータを、1行の設定値として渡したい場面で使われます。証明書のファイルが英数字の塊になっているのも同じ理由です。
Base64は暗号ではありません。ここを取り違えると事故になります。
暗号には鍵があり、鍵を持たない相手は中身を読めません。Base64に鍵はなく、変換の規則は公開されています。読めなくなるのは人間の目にとってだけで、誰でも一瞬で元に戻せます。
古くからある認証方式のひとつは、利用者名とパスワードをBase64にして送るだけの作りです。これは暗号化された通信路と組み合わせて初めて意味を持ちます。包装そのものには保護の力がありません。
違います。暗号には鍵があり、鍵を持たない相手には戻せません。Base64には鍵がなく、変換の規則は公開されているため、誰でも元のデータに戻せます。読めなくなるのは人間にとってだけで、機械にとっては素通しです。したがって、パスワードや個人情報をBase64にしても、保護したことにはなりません。実際、古くからある認証方式のひとつは利用者名とパスワードをBase64にして送るだけで、これは暗号化された通信と組み合わせて初めて意味を持ちます。
扱える文字の種類を減らしているためです。Base64は英数字と記号2つ、あわせて64種類の文字だけを使います。元のデータは1つの単位で256通りを表せるので、そのままでは収まりません。そこで、元のデータ3つぶんを4文字に割り当て直します。3が4になるため、容量はおよそ1.33倍になります。メールの添付ファイルは内部でこの変換を経るため、送信できる上限が25メガバイトであれば、実際に添付できるファイルは19メガバイト前後が目安になります。
長さの調整に使われる印です。Base64は元のデータを3つずつの組にして変換しますが、データの長さが3で割り切れないと、最後の組が欠けます。そのとき、足りないぶんを = で埋めて4文字の形をそろえます。余りが1つなら = が2つ、余りが2つなら = が1つ付きます。したがって末尾の = は多くても2つで、3つ以上並んでいる場合は文字列がどこかで壊れています。= は捨ててよい飾りではなく、消すと復元できなくなることがあります。
Base64が使う記号のうち、プラス記号・スラッシュ・イコールは、URLの中では別の意味を持つためです。スラッシュは階層の区切り、プラス記号は場所によって半角スペースとして解釈され、イコールは値の区切りです。そのため、そのまま貼ると意図しない切れ方をします。対処は2つあり、ひとつはURL用の変換をもう一段かけること、もうひとつはURL向けに記号を置き換えた形式を使うことです。後者ではプラス記号とスラッシュが別の記号に置き換えられます。