テクノロジー · 実用ガイド
Python の validate=True が複数の Base64 を受理?canonical padding bits を強制する
厳格な alphabet 検査と RFC 4648 の canonical encoding は別物です。Python 3.15+ は canonical=True、旧版は decode 後の exact re-encode 比較を使います。

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 します。
