初めに
今までなんとなく利用していたBase64エンコードですが、実際どんなことをしているのかよく分かっていませんでした。
「圧縮してパフォーマンス向上?」「暗号化してセキュリティー向上?」くらいに思っていたのですが、どうやらそんなことはないみたいです。
今回は、Base64エンコードの方法とその目的についてまとめます。
Base64エンコードとは
Base64エンコードとはエンコードの手法の一つです。データを64種類の文字で表すようにエンコードをします。
64種類の文字はアルファベット(a-z
とA-Z
)、数字(0-9
)そして一部記号(+
,/
)の64種類で構成されます。
Base64が圧縮できない理由
本題です。Base64ではデータを圧縮することはできません。
その理由は、Base64のアルゴリズムにあります。
以下はBase64のアルゴリズムの説明です。
Hello
↓ バイナリデータ(2進数)に変換
0100100001100101011011000110110001101111
↓ 6ビットごとに区切る
010010 000110 010101 101100 011011 000110 1111
↓ 6ビットに足りない場合、0埋めする
010010 000110 010101 101100 011011 000110 111100
↓ 各6ビットを対応する文字に置き換える
S G V s b G 8
↓ 数が4の倍数個になるように、「=」で埋める
SGVsbG8=
この通り、「Hello」の5文字が「SGVsbG8=」という8文字にエンコードされました。
Base64では変換の過程でバイナリデータを6ビットごとに分割します。対して、UTF-8でエンコードされた文字は1文字に8~32ビットを使います。そのため、Base64でエンコードをした際は文字が長くなってしまいます。
Base64がセキュリティ向上で使われない理由
上述のエンコード過程をご参照ください。
Base64では各6ビット配列を文字に直すことしかしていません。だれでも簡単にデコードすることが可能です。そのため、セキュリティー向上のために利用することはできないのです。
Base64エンコードの目的
圧縮もセキュリティ向上もできないBase64は何目的で利用されるのでしょうか。
目的1:バイナリデータの送信
HTTPなど一部のプロトコルは、画像や音声などのバイナリデータをそのまま扱うことはできません。扱うためにはテキストデータに直す必要があります。
Base64はバイナリデータをテキストに変換することが可能なため、その用途で利用されます。
目的2:非ASCIIデータをASCIIに変換
SMTPやURLなどでは、漢字やひらがななどの非ASCIIデータを扱うことができません。
Base64で扱う文字は全てASCIIデータのため、そのようなプロトコルで非ASCIIデータを扱うために利用されます。
ASCIIとは、英語のアルファベット、数字、記号、制御文字を7ビットで表現する文字コードのことです。
7ビットなので、6ビットのBase64の倍の128種類の文字が利用されます。
終わりに
今までよくわからずに使っていたBase64ですが、アルゴリズムや目的が理解するのは面白いですね。
Base64以外にも様々なエンコード方式がありますが、ただ仕様に沿って実装するだけでなく、目的やアルゴリズムを理解した上で実装するのが大切ですね。
ここまでご覧いただきありがとうございました!
参考