base64エンコーディングとは? 解説
base64は、任意のバイナリデータを64文字のプレーンなASCIIテキストの集合を使って表現するエンコーディングで、バイナリがテキストのみのチャネルを通過できるようにします。
base64は転送の問題を解決します: 多くのシステムはテキストのみを安全に扱いますが、しばしばバイナリデータ - 画像、鍵ファイル、証明書 - をそれらを通じて移動する必要があります。base64はバイナリのバイトをプレーンなASCIIとして書き換え、テキストのみのパイプを生き延びられるようにします。CIのあらゆる場所にあり、特にバイナリのsecretをパイプラインに出し入れするのに使われます。
base64エンコーディングとは
base64はバイナリデータを3バイトずつ取り、文字、数字、プラス、スラッシュからなる64シンボルのアルファベットから引いた4文字として書き換え、等号でパディングします。結果は元より約3分の1大きくなりますが、安全で印字可能なASCIIだけを含みます。
エンコーディングは暗号化ではない
これが最も重要な点です: base64は鍵なしで誰でも元に戻せます。何も隠しません。base64の文字列は、乱雑に見えるからといってsecretではありません - デコードは簡単です。文字列そのものが漏洩した場合、base64エンコードされた認証情報は完全に露出しているものとして扱ってください。
テキストチャネルがそれを必要とする理由
環境変数、JSONのフィールド、YAMLの値、emailはすべてテキストを期待します。生のバイナリをそれらに詰め込むと、バイトが破損したりフォーマットが壊れたりします。base64はバイナリを包んで変わらず通過できるようにし、受信者がそれを元のバイトにデコードし直します。
CIのsecretにおけるbase64
CIのsecretはテキストを保存するため、バイナリの認証情報 - service accountのJSON、keystore、PEMファイル - はしばしばbase64エンコードされ、secretとして保存され、jobでファイルにデコードし直されます。secretはログ内でマスクされたままです。base64は単にバイナリを安全に保存・転送できるようにするだけです。
# Decode a base64 secret back to a file in CI
steps:
- run: echo "${{ secrets.KEYSTORE_B64 }}" | base64 -d > release.keystoreLatchkeyについての注記
secretのマスキングはLatchkeyのrunnerでもGitHub-hostedのものとまったく同じように適用されるため、base64エンコードされたsecretはログ内で伏せられたままです - ただし、エンコーディング自体は保護を追加せず、安全な転送だけを提供することを忘れないでください。
重要なポイント
- base64はバイナリを印字可能なASCIIに書き換え、テキストのみのチャネルを通過できるようにします。
- これはエンコーディングであり暗号化ではありません - 誰でもデコードできるため、秘匿性はありません。
- CIはしばしばバイナリの認証情報をbase64エンコードしてテキストのsecretとして保存し、jobでファイルにデコードします。