テクノロジー · 実用ガイド

Python の validate=True が複数の Base64 を受理?canonical padding bits を強制する

厳格な alphabet 検査と RFC 4648 の canonical encoding は別物です。Python 3.15+ は canonical=True、旧版は decode 後の exact re-encode 比較を使います。

Base64 の syntax、byte decode、canonical gate を分けたオリジナル図。
オリジナルイラスト:alphabet、bytes、canonical spelling を順に確認します。 Watch at Ease

validate=True は alphabet と padding 構造を検査しますが、Python 3.14 以前では未使用 pad bits が非ゼロの alias を受理し得ます。複数の text が同じ bytes に decode されます。

Python 3.15 は canonical=True、旧版は同じ protocol policy で strict decode と exact re-encode comparison を行います。canonical text を authentication と混同しないでください。

1. 再現できる挙動

CPython 3.12.14 では三つの入力が同じ c1 に decode されます。validate=True は旧版の zero-pad-bit check ではありません。

encoder は一つの canonical form を出しますが、decoder が未使用 bits を無視すると多対一になります。

2. pad bits の仕組み

入力が1 byte の場合、二つ目の symbol の上位2 bits だけが data で、残り4 bits は pad bits です。

syntax、decoded bytes、canonical text を別々に判定します。

3. Python 3.15

base64.b64decode(value, validate=True, canonical=True) を使い、alias を binascii.Error にします。

padding、whitespace、URL-safe alphabet の policy も明示します。

4. 旧版 fallback

validate=True で decode し、base64.b64encode で re-encode して input と完全一致を要求します。

任意の equals を追加せず、unpadded/URL-safe protocol は専用の canonical form を定義します。

5. 重要な利用箇所

database key、cache key、dedupe、allow-list、signature input、audit id では alias が identity を分裂させます。

可能なら decoded bytes を保存・比較し、text が必要なら boundary で canonicalize します。

6. authentication ではない

悪意ある bytes も canonical に encode できます。MAC または digital signature を検証します。

canonical value、alias、invalid alphabet、bad padding、全 variant を test します。

validate、canonical、re-encode、authentication の保証を比較するオリジナル表。
オリジナルイラスト:canonicalization は一意表記、signature/MAC は信頼を提供します。 Watch at Ease