同じバイト、異なる文字表

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-
値62と63のBase64とBase64url文字、および2つのテキスト例
自作の文字表比較図。下の行は架空の入力を実際にエンコードした結果です。

RFC 4648 §5: Base64url alphabet

見た目だけで形式を判断しない

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== Zg

MoyoutilはBase64urlの自動変換やJWS署名検証を提供しません。このコードは形式比較用です。読めるテキストを得ても署名の有効性は確認できません。JWSの署名入力には元のエンコード済みヘッダーとペイロードが含まれるため、署名検証の入力を再エンコードして変更しないでください。

RFC 7515 §2–3: Base64url and JWS signing input

よくある質問

-と_を削除すればデコードできますか?

削除しないでください。値62と63を表すデータ文字です。削除すると元のデータが変わる可能性があります。このツールが受け付ける標準Base64が必要なら、元のシステムから標準形式で出力してください。