Base64URL vs standard Base64: alfabet, udfyldning og URL parsing

Genkend bindestreg og understregning, forstå valgfri udfyldning, og undgå plus-til-mellemrum-korruption i URL forespørgselsparametre.

Base64URL ændrer to alfabettegn: standard Base64s plus bliver en bindestreg, og skråstreg bliver en understregning. Den kodede information er uændret. Varianten hjælper, når den omgivende protokol giver speciel betydning til plus eller skråstreg, men den fritager ikke værdien fra hver URL eller anvendelsesregel.

Brug en vektor, der afslører forskellen

Bytes FB FF koder som +/8= i standard Base64 og -_8= i Base64URL. En test som Hello producerer kun delte alfabettegn, så den kan ikke afsløre, om URL-sikker konvertering virker.

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

Polstring er en særskilt aftale

Mange tokenformater udelader afsluttende lighedstegn, mens andre systemer beholder dem. Ændring af alfabetet og fjernelse af udfyldning er to separate valg. Hvis længden af input uden udfyldning giver resten 2 ved division med 4, skal der tilføjes to lighedstegn; hvis resten er 3, skal der tilføjes ét. En rest på 1 kan ikke rettes alene ved at tilføje udfyldning, fordi et enkelt tegn på seks bit ikke kan beskrive en hel byte.

Ved validering skal du også kontrollere ubrugte bits i det sidste tegn. En dekoder, der ignorerer dem, kan acceptere flere strenge for den samme bytesekvens. Denne tvetydighed kan have betydning, når en applikation sammenligner kodede strenge i stedet for afkodede bytes. En kanonisk producent bør udsende én aftalt repræsentation.

Forveksle ikke forespørgselsparsing med Base64 afkodning

Forespørgselsparsing i formularstil fortolker et bogstaveligt plus som et mellemrum. En standard Base64 værdi indsat uescaped i en forespørgsel kan derfor blive beskadiget, før dekoderen ser den. Konstruer forespørgslen med URLSearchParams, eller brug varianten Base64URL, hvis den modtagende protokol specificerer det.

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

Udskift ikke automatisk hvert mellemrum med plus: et mellemrum kan være ægte formatering eller bevis på en anden fejl. Bevar kilden, identificer det transportlag, der ændrede den, og anvend en bevidst rettelse. For JWT segmenter skal du bruge tokenformatets Base64URL regler i stedet for at opfinde en generel reparationspolitik.

Standard- og URL-sikre alfabeter er beskrevet i RFC 4648. Din integration har stadig brug for eksplicitte valg for polstring, accept af blanktegn og maksimal længde.