Ontwikkelaars

Wat Is Base64-codering? Uitgelegd met Bits en Voorbeelden

8 min leestijd

Base64-codering zet willekeurige tekst of binaire data om in een reeks van 64 afdrukbare ASCII-tekens, zodat die data heelhuids door systemen komt die alleen tekst aankunnen. Elke 3 bytes van je originele data worden precies 4 Base64-tekens, waardoor de uitvoer ongeveer 33% groter is dan de invoer.

Wat Base64-codering eigenlijk doet

Het Base64-alfabet bestaat uit A-Z, a-z, 0-9, plus + en /, samen 64 symbolen. Daar komt het teken = nog bij als opvulling aan het einde van de string, waarover verderop meer. Elk teken uit dat alfabet staat voor een vaste positie, van 0 tot en met 63, en die posities zijn precies wat je nodig hebt om 6 bits mee te coderen.

Wat Base64 nadrukkelijk niet is: versleuteling of compressie. Er komt geen geheime sleutel aan te pas, iedereen die de codering kent kan het resultaat terugzetten naar de oorspronkelijke data, en de uitvoer is groter dan de invoer, niet kleiner. Dit is het misverstand dat je het vaakst tegenkomt: iemand “codeert” een wachtwoord met Base64 en denkt dat het daarmee beschermd is. Dat is het niet. Base64 verbergt niets, het herschrijft alleen het formaat.

Hoe het werkt: “Man” bit voor bit coderen

De beste manier om te snappen dat Base64 geen magie is maar gewoon een omzetting tussen grondtallen, is de tekst “Man” met de hand te coderen.

Elk teken heeft een ASCII-waarde: M is 77, a is 97, n is 110. Schrijf die drie waarden uit als 8-bits binaire getallen:

TekenASCII-waardeBinair (8 bits)
M7701001101
a9701100001
n11001101110

Plak die drie groepen van 8 bits aan elkaar en je krijgt 24 bits achter elkaar: 010011010110000101101110. Base64 knipt die 24 bits niet in groepen van 8 (bytes), maar in groepen van 6 bits, want 6 bits geeft precies 2⁶ = 64 mogelijke waarden, evenveel als er tekens in het Base64-alfabet staan. Vier groepen van 6 bits passen exact in 24 bits, wat meteen verklaart waarom 3 bytes altijd 4 Base64-tekens opleveren.

6-bits groepDecimale waardeBase64-teken
01001119T
01011022W
0001015F
10111046u

Lees de laatste kolom van boven naar beneden en je krijgt “TWFu”, de Base64-codering van “Man”. Geen enkele stap hierin is willekeurig: het is puur een herverdeling van dezelfde 24 bits over andere groepsgroottes, gevolgd door een opzoeking in een vaste tabel.

Padding: waarom sommige Base64-strings eindigen op =

De rekensom hierboven werkt precies omdat “Man” toevallig 3 bytes lang is, en 3 bytes (24 bits) exact deelbaar is door 4 groepen van 6 bits. De meeste tekst is niet netjes een veelvoud van 3 bytes, en dan moet Base64 de laatste groep opvullen.

InvoerBytesResultaatUitleg
”M”1 byteTQ==1 byte levert maar genoeg bits voor 2 echte tekens, de rest wordt opgevuld met 2 =-tekens
”Ma”2 bytesTWE=2 bytes levert genoeg bits voor 3 echte tekens, met 1 =-teken erachter
”Man”3 bytesTWFu3 bytes vult alle 4 tekens volledig, geen padding nodig

Het =-teken draagt geen data, het vertelt een decoder alleen: “de laatste groep bits is niet volledig, negeer het opgevulde deel.” Zonder die marker zou een decoder niet kunnen zien of een string precies past of ergens is afgekapt.

Waar je Base64 in het echt tegenkomt

Base64 duikt overal op waar binaire of speciale data door een puur tekstueel kanaal moet. Een paar concrete voorbeelden, allemaal berekend met dezelfde regels als hierboven:

“Hello, World!” wordt SGVsbG8sIFdvcmxkIQ==.

“user:pass1234” wordt dXNlcjpwYXNzMTIzNA==. Dat is letterlijk wat HTTP Basic Authentication verstuurt: de header Authorization: Basic <base64(gebruiker:wachtwoord)> bevat precies deze codering, geen versleuteling, dus alleen bruikbaar over HTTPS.

Een JSON-payload zoals {"id":42,"active":true} wordt eyJpZCI6NDIsImFjdGl2ZSI6dHJ1ZX0=. Handig als je een klein stukje gestructureerde data in een URL-parameter of een tokensegment wilt meesturen zonder dat aanhalingstekens en accolades de rest van de URL in de war schoppen.

“café” wordt Y2Fmw6k=. De é telt in UTF-8 als 2 bytes, dus dit woord van 4 letters bestaat eigenlijk uit 5 bytes en wordt daardoor 8 Base64-tekens, niet de 6 die je zou verwachten als je alleen naar het aantal zichtbare letters kijkt. Base64 codeert bytes, geen letters.

Een emoji zoals 🚀 wordt 8J+agA==. Eén enkel zichtbaar teken, maar in UTF-8 zijn dat 4 bytes, en die worden gewoon net zo gecodeerd als elke andere byte-reeks.

Andere plekken waar je dit patroon terugziet: data:-URL’s in CSS en HTML (een klein icoontje rechtstreeks in de stylesheet zonder apart bestand), MIME-bijlagen in e-mail, en JWT’s. Een JWT bestaat uit drie Base64url-segmenten gescheiden door punten: header.payload.signature. Deze site heeft geen gespecialiseerde JWT-decoder, maar het payload-segment is gewoon te decoderen met een standaard Base64- of Base64url-decoder, precies wat de decoder hieronder doet.

Codeer of decodeer je eigen tekst

Typ of plak je tekst hieronder om direct te zien hoe de Base64-codering eruitziet.

Base64 Encoder
Gratis, geen registratie, werkt op elk apparaat.
Open de volledige tool

Heb je juist een Base64-string en wil je weten wat erin zit? Plak hem in de decoder eronder.

Veelgemaakte fouten en randgevallen

Base64 aanzien voor beveiliging. Dit is het punt waard om nog een keer scherp te stellen: Base64 coderen van een wachtwoord of API-sleutel beschermt niets. Iedereen met de string kan hem in twee seconden terugzetten naar de oorspronkelijke tekst, zonder sleutel, zonder wachtwoord. Als je gevoelige data wilt beschermen, gebruik je echte versleuteling, niet Base64.

Standaard Base64 gebruiken in een URL. Het gewone alfabet bevat +, / en =, en die tekens hebben allemaal een eigen betekenis in een URL of querystring: + kan als spatie worden gelezen, / kan als padscheiding worden opgevat, en = scheidt een parameter van zijn waarde. Daarom bestaat Base64url, een variant die - en _ gebruikt in plaats van + en /, meestal zonder padding. Zie je ergens een Base64-achtige string zonder +, / of =, dan is dat vrijwel zeker Base64url, zoals in JWT’s en bestandsnamen.

Whitespace of ontbrekende padding. Sommige strikte decoders accepteren geen regeleinde of spatie middenin een Base64-string, en klagen als het aantal =-tekens niet klopt met de lengte van de rest. Plak je een Base64-string uit een e-mail of PDF, controleer dan of er geen regeleinde is meegekopieerd.

Multibyte tekens onderschatten. Zoals café en 🚀 hierboven laten zien, codeert Base64 op byteniveau, niet op karakterniveau. Tekst met accenten, Chinese of Japanse tekens, of emoji’s neemt meer bytes in beslag dan het aantal zichtbare tekens doet vermoeden, en dus wordt de Base64-uitvoer navenant langer.

Per ongeluk dubbel coderen. Codeer je een string die al Base64 is nog een keer, dan krijg je een geldige maar zinloze Base64-string terug. Decodeer je die maar één keer, dan zie je nog steeds de eerste laag Base64 in plaats van de oorspronkelijke tekst. Dit gebeurt vaker dan je zou denken bij scripts die data doorsturen tussen meerdere systemen die elk hun eigen Base64-stap toepassen.

Veelgestelde vragen

Kan ik Base64 omkeren zonder wachtwoord of sleutel? Ja, altijd. Base64 is een openbaar, vast alfabet, geen geheim. Iedereen met de gecodeerde string en een standaard decoder (zoals de tool hierboven) krijgt exact de oorspronkelijke data terug.

Waarom is de Base64-uitvoer altijd groter dan de invoer? Omdat elke 6 bits Base64-data wordt opgeslagen in een heel teken van 8 bits (1 byte tekst), terwijl de oorspronkelijke data die informatie compacter in 8-bits bytes had staan. Dat verschil in efficiëntie zorgt voor de vaste groei van ongeveer 33%: elke 3 bytes invoer wordt 4 tekens uitvoer.

Wat betekenen de =-tekens aan het einde van een Base64-string? Padding. Ze verschijnen alleen als de invoerlengte geen veelvoud van 3 bytes is, en geven aan hoeveel van de laatste 6-bits groep uit opvulling bestaat in plaats van echte data. Eén = betekent dat de invoer 2 bytes overhad na de laatste volledige groep van 3, twee =-tekens betekenen dat er 1 byte overbleef.

Is Base64url hetzelfde als gewoon Base64? Bijna. Base64url gebruikt hetzelfde principe en dezelfde 64 posities, maar vervangt + door - en / door _, en laat de padding meestal weg. Dat maakt de uitvoer veilig om zonder verdere bewerking in een URL, bestandsnaam of JWT te plakken, waar de standaardtekens problemen zouden geven.

Kan deze tool ook binaire bestanden zoals afbeeldingen coderen, niet alleen tekst? De encoder hierboven werkt met tekstinvoer die je typt of plakt. Voor het onderliggende principe maakt het geen verschil: elke byte, of die nu uit tekst of uit een afbeeldingsbestand komt, wordt op precies dezelfde manier in groepen van 6 bits opgedeeld en naar het Base64-alfabet vertaald.

Base64CoderingEncodingOntwikkelaars
Base64 Encoder
Probeer het nu zelf met de volledige tool.
Nu proberen
Gerelateerde tools