Base64URL kontra standard Base64: alfabet, utfyllnad och URL analys

Känn igen bindestreck och understreck, förstå valfri utfyllnad och undvik korruption av plus-till-mellanslag i URL frågeparametrar.

Base64URL ändrar två bokstäver: standard Base64s plus blir ett bindestreck och snedstreck blir ett understreck. Den kodade informationen är oförändrad. Varianten hjälper när det omgivande protokollet ger speciell betydelse åt plus eller snedstreck, men den undantar inte värdet från varje URL eller tillämpningsregel.

Använd en vektor som exponerar skillnaden

Byte FB FF kodar som +/8= i standard Base64 och -_8= i Base64URL. Ett test som Hello producerar bara delade alfabettecken, så det kan inte avslöja om URL-säker konvertering fungerar.

const standard = btoa(String.fromCharCode(251, 255));
const urlSafe = standard.replace(/\+/g, '-').replace(/\//g, '_');
console.log(standard); // +/8=
console.log(urlSafe); // -_8=

Stoppning är ett separat avtal

Många tokenformat utelämnar avslutande likhetstecken, medan andra system behåller dem. Att ändra alfabetet och ta bort utfyllnad är två separata val. Om längden på indata utan utfyllnad ger resten 2 vid division med 4 behövs två likhetstecken; om resten är 3 behövs ett. En rest på 1 kan inte rättas enbart genom utfyllnad, eftersom ett enda sexbitarstecken inte räcker för att representera en hel byte.

Vid validering, kontrollera även oanvända bitar i det sista tecknet. En avkodare som ignorerar dem kan acceptera flera strängar för samma bytesekvens. Den oklarheten kan ha betydelse när en applikation jämför kodade strängar istället för avkodade byte. En kanonisk producent bör avge en överenskommen representation.

Blanda inte ihop frågeanalys med Base64-avkodning

Parsing av frågeformulär i formulär tolkar ett bokstavligt plus som ett mellanslag. Ett standardvärde för Base64 som klistrats in utan escape i en fråga kan därför skadas innan avkodaren ser det. Konstruera frågan med URLSearchParams, eller använd varianten Base64URL om det mottagande protokollet anger det.

const query = new URLSearchParams({ payload: '+/8=' });
console.log(query.toString()); // payload=%2B%2F8%3D
console.log(query.get('payload')); // +/8=

Ersätt inte varje blanksteg automatiskt med plus: ett blanksteg kan vara äkta formatering eller bevis på ett annat fel. Bevara källan, identifiera transportskiktet som ändrade den och tillämpa en avsiktlig korrigering. För JWT-segment, använd tokenformatets Base64URL-regler istället för att uppfinna en allmän reparationspolicy.

Standard- och URL-säkra alfabet beskrivs i RFC 4648. Din integration behöver fortfarande tydliga val för utfyllnad, acceptans av blanksteg och maximal längd.