このような文字の壁を見たことがあれば SGVsbG8gV29ybGQ= そして暗号化されていると思った場合 — あなただけではありません。Base64は開発者のツールキットの中で最も誤解されているツールの1つです。それは ない 暗号化です。データを保護しません。バイナリデータをテキスト限定システムを通じて安全に移動できるようにするだけです。
Base64実際には何であるか
Base64はバイナリデータを64個の印字可能なASCII文字の文字列に変換するエンコーディングスキームです: A–Z, a–z, 0–9, +、 そして /。名前はその文字セットのサイズに由来します — 64個のシンボル、それぞれが6ビットのデータを表します。
入力の3バイト(24ビット)ごとに、4つのBase64文字(4 × 6ビット = 24ビット)にマップされます。入力の長さが3で割り切れない場合、 = パディング文字が最後のグループを埋めます。これが、Base64文字列の末尾に1つまたは2つの等号記号が表示されることが多い理由です。
それが存在する理由
一部のチャネルは厳密にテキスト用に構築されていました。古いメールプロトコル(SMTP)、HTTPヘッダー、JSONペイロード、HTML属性には、誤解なくキャリーできるバイト数の制限があります。生のバイナリファイルがこれらのチャネルを通過すると、破損する可能性があります — ヌルバイトが削除され、行の終わりが変換され、制御文字が意図しない動作をトリガーします。
Base64はすべてを回避します。バイナリを予測可能な印字可能文字のセットに変換することで、CSSデータURIに画像を安全に埋め込み、メールにファイルを添付し、トークンをHTTPヘッダーに詰め込み、JSON内にバイナリペイロードを含めることができます。トレードオフ: エンコードされたデータは元のサイズより約33%大きくなります。
エンコーディングの仕組み(短いバージョン)
文字列を取ります Man。ASCIIバイトでは: 77 97 110。バイナリでは: 01001101 01100001 01101110。6ビットグループに分割: 010011 010110 000101 101110。各をBase64アルファベットにマップ: T W F u → TWFu.
余ったバイトがある場合、パディングが発生します。1つの余ったバイトは2つのBase64文字と ==を生成します。2つの余ったバイトは3つの文字と =.
を生成します。
Base64はセキュリティではない = これは繰り返す価値があります。Base64は、デコーダーを持っている人なら誰でも可逆的です — キーは不要、パスワードは不要です。クライアント側コードでパスワード、トークン、または機密データを「非表示」にするために使用すると、ゼロ保護が提供されます。攻撃者はBase64がどのように見えるかを知っています。末尾の
は明らかです。
保存中のデータを保護する必要がある場合は、適切な暗号化(AES-256)を使用してください。転送中のデータを保護する必要がある場合は、TLSを使用してください。Base64は転送の便宜であり、セキュリティレイヤーではありません。
- Base64を使用する時期 データURI
src="data:image/png;base64,iVBOR..." - — HTMLまたはCSSに画像を直接埋め込む: 基本認証ヘッダー
username:password— HTTPベーシック認証はAuthorizationをBase64で - ヘッダーにエンコードします(実際のセキュリティにはHTTPSが必要です) JWT
- — JSON Webトークンは、ヘッダーとペイロードセクションをエンコードするためにBase64URLを使用します JSON/XMLのバイナリペイロード
- メールの添付ファイル — APIまたはメッセージ形式がテキストのみを話す場合
— MIMEエンコーディングはバイナリファイルパーツにBase64を使用します ブラウザでの高速エンコーディングおよびデコーディングの場合、 IO Tools Base64エンコーダー/デコーダー
は、何もインストールせずに標準およびURL安全なバリアントの両方を処理します。
パイソン
import base64
# Encode
encoded = base64.b64encode(b"Hello, World!")
print(encoded) # b'SGVsbG8sIFdvcmxkIQ=='
# Decode
decoded = base64.b64decode(b"SGVsbG8sIFdvcmxkIQ==")
print(decoded) # b'Hello, World!'
Bash
# Encode
echo -n "Hello, World!" | base64
# SGVsbG8sIFdvcmxkIQ==
# Decode
echo "SGVsbG8sIFdvcmxkIQ==" | base64 --decode
# Hello, World!
実践でのエンコーディングとデコーディング
// Encode (browser)
const encoded = btoa("Hello, World!");
console.log(encoded); // SGVsbG8sIFdvcmxkIQ==
// Decode (browser)
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // Hello, World!
// Node.js
const enc = Buffer.from("Hello, World!").toString("base64");
const dec = Buffer.from(enc, "base64").toString("utf8");
注記: btoa そして atob JavaScript(ブラウザとNode.js) TextEncoder.
はブラウザでLatin-1文字のみを処理します。Unicode文字列の場合は、最初に
を使用してバイト表現に変換します + そして / 標準対URLセーフBase64
| 財産 | 標準Base64は | を使用します — URLとクエリ文字列で特別な意味を持つ両方の文字。URL安全なBase64はそれらを入れ替えてエンコーディングの頭痛を回避します: |
|---|---|---|
| 標準Base64 | URL安全Base64 +, / | URL安全Base64 -, _ |
| パディング | = 文字セット | = A–Z, a–z, 0–9, |
| (必須) | (多くの場合、省略) + そして / URL安全? | いいえ — |
| パーセントエンコードされる必要があります | はい — URLとファイル名で安全 | 一般的な用途 |
メール、MIME、一般的なエンコーディング base64.urlsafe_b64encode() JWT、OAuthトークン、URLパラメーター = Pythonでは、
URL安全な出力を使用してください。JWT具体的には末尾の
パディングを削除します — これは問題ありません。文字列の長さからデコーダーが推測できるため。
恵 スコアボードが到着しました!
スコアボード ゲームを追跡する楽しい方法です。すべてのデータはブラウザに保存されます。さらに多くの機能がまもなく登場します!
