同じバイト、異なる文字表
RFC 4648の標準Base64は値62と63に+と/を使い、Base64urlは-と_を使います。???は標準形式ではPz8/、URL形式ではPz8_です。>>>はPj4+とPj4-になります。Moyoutilのテキスト用Base64ツールは標準文字列を復元しますが、-や_を含む文字列には形式エラーを返します。以下のNode.jsコードで両形式を別途再現します。
for (const text of ["???", ">>>"]) {
const bytes = Buffer.from(text, "utf8");
console.log(bytes.toString("base64"),
bytes.toString("base64url"));
}
// Pz8/ Pz8_
// Pj4+ Pj4-見た目だけで形式を判断しない
fooは両形式ともZm9vです。+、/、-、_がなくても標準Base64とは断定できません。生成元のシステムの形式仕様を確認してください。パディングは別の規則です。RFC 4648は参照仕様に別の定めがなければパディングを要求し、RFC 7515のJWS Base64url定義は末尾の=を省略します。例えばfは標準形式でZg==、パディングなしのURL形式でZgです。
for (const text of ["foo", "f"]) {
const bytes = Buffer.from(text, "utf8");
console.log(bytes.toString("base64"),
bytes.toString("base64url"));
}
// Zm9v Zm9v
// Zg== ZgMoyoutilはBase64urlの自動変換やJWS署名検証を提供しません。このコードは形式比較用です。読めるテキストを得ても署名の有効性は確認できません。JWSの署名入力には元のエンコード済みヘッダーとペイロードが含まれるため、署名検証の入力を再エンコードして変更しないでください。
よくある質問
-と_を削除すればデコードできますか?
削除しないでください。値62と63を表すデータ文字です。削除すると元のデータが変わる可能性があります。このツールが受け付ける標準Base64が必要なら、元のシステムから標準形式で出力してください。