Base64を勉強する過程のメモ

Base64

まず、なんとなく分かった気になれる動画を見る What is Base64? external_link
あらゆる文字を変換するための規格のようなものだろうか...?

MDNを見てみる

Base64 のエンコードとデコード external_link

バイナリーからテキストへの符号化を行う手法のグループであり、64 を基数とする表現に変換することで、バイナリーデータを ASCII 文字列で表すことができます。

wikipedia に書かれている利用例1から分かる通り、電子メールでは 7ビット文字列以外をやり取りすることができない2
そのため、ASCII 文字列に変換する必要がある。その手法の一部が Base64 ?

エンコードとデコード方法3

example.js
var encodedData = window.btoa("Hello, world"); // 文字列のエンコード var decodedData = window.atob(encodedData); // 文字列のデコード

ASCII 文字

半角の英字(a~z、A~Z)やアラビア数字(0~9)、記号、空白文字、制御文字など128文字が規定されている文字コードの標準規格

利用箇所と例

メールの添付ファイル

  • 添付ファイルをつけたときのメール文面はどうなっているか?

スクリーンショット 2020-04-22 9.16.27.png Content-Transfer-Encoding: base64 とあるように base64 でエンコードされているようだ

  • なぜ base64 エンコードされているのか?

ルールで決まっているらしい external_link

MIMEによってあらゆるデータをテキスト(正確には、英語圏の人間にとってのテキスト)に変換して送受信しようとするのが、インターネットメールの根本的な考え方である。つまり、普段よく利用するインターネットメールへのファイルの添付とは、ファイルをテキスト化する作業のことになる。

Content-Transfer-Encoding: 格納方法

  • 7bit
  • 8bit
  • binary
  • quoted-printable
  • base64

8 bit と binary は インターネットメールを8ビット・データに対応させるために、8ビットのままで利用するための定義。 厳密にはこの2つの方法は仕様違反

SSL証明書

  • 証明書の中身はどうなっているか?
  • なぜ base64 エンコードされているのか?

JWT(JSON Web Token)

  • JWT を利用したサイトでログイン時にやり取りされる内容はどうなっているか?
  • なぜ base64 エンコードされているのか?

SAML

  • ログイン時に IdP と SP でやり取りされる内容はどうなっているか?
  • なぜ base64 エンコードされているのか?

Kubernetes Secret

  • クラスタに対して create secret した後に、get secret するとどうなっているか?
  • なぜ base64 エンコードされているのか?

Footnotes

  1. https://ja.wikipedia.org/wiki/Base64 external_link

  2. SMTPが本来テキストベースのプロトコルであり、メッセージやメールデータが 7ビットASCLL でなければならないという制限があった。
    が電子メールに MIME(Multipurpose Internet Mail Extension) という規格がつくられ、SMTP自体にも8ビットで伝送する拡張が標準化された。

  3. https://developer.mozilla.org/ja/docs/Web/API/WindowBase64/btoa external_link