Salt la conținut

Ghid pentru Codor / Decodor

Ghid de instrument. Actualizat .

La ce folosesc Base64, codarea URL și entitățile HTML, cum convertește Codor / Decodor text UTF-8 și baze numerice și de ce codarea nu este criptare.

Ce face Base64

Base64 (RFC 4648) ia octeții câte trei, împarte cei 24 de biți în patru grupuri de câte 6 biți și asociază fiecărui grup unul dintre cele 64 de caractere: A–Z, a–z, 0–9, + și /. Când lungimea intrării nu este multiplu de trei, padding-ul = completează ultimul grup. Ieșirea este cu aproximativ 33% mai mare decât intrarea, dar conține numai caractere care supraviețuiesc sistemelor construite pentru text. Această creștere este prețul transportului sigur: în ieșire nu mai rămâne niciun octet care să deruteze un sistem vechi ce taie al optulea bit sau interpretează caractere de control.

Codarea cuvântului Hi! în Base64Cei trei octeți ai lui Hi! sunt uniți în 24 de biți, împărțiți în patru grupuri de câte 6 biți și asociați alfabetului Base64, rezultând SGkh.Text: Hi!Octeții UTF-8 0x48 0x69 0x2124 de biți01001000 01101001 00100001Patru grupuri de câte 6 biți010010 000110 100100 100001 = 18, 6, 36, 33Căutare în alfabet18 → S, 6 → G, 36 → k, 33 → hRezultat: SGkhNu este nevoie de padding, pentru că intrareaa avut 3 octeți
Cei trei octeți ai lui Hi! sunt uniți în 24 de biți, împărțiți în patru grupuri de câte 6 biți și asociați alfabetului Base64, rezultând SGkh.

Printre utilizările obișnuite se numără atașamentele de e-mail (MIME), URI-urile data care înglobează imagini mici în HTML sau CSS, câmpurile binare din JSON, antetele de autentificare HTTP Basic și părțile unui JSON Web Token. Aceste canale au în comun faptul că nu pot transporta în siguranță octeți bruți; un server intermediar poate recoda textul, poate schimba sfârșiturile de linie sau poate strica octeții non-ASCII. Base64 elimină riscul, pentru că ieșirea lui folosește un set restrâns de caractere care înseamnă același lucru în orice sistem. În fiecare dintre aceste cazuri scopul este transportul, nu secretul.

Cum folosiți Base64 în Codor

  1. Deschideți Codor / Decodor.
  2. Alegeți Codifică pentru a transforma textul în Base64 sau Decodează pentru a transforma Base64 în text.
  3. Bifați „Alfabet sigur pentru URL” pentru Base64url, care folosește - și _ și renunță la padding.
  4. Lipiți intrarea; rezultatul se actualizează în browserul dumneavoastră și poate fi copiat.

Textul este codat ca UTF-8, așa că sunt tratate corect caractere precum ș, ü ori emoji. Când decodarea produce octeți care nu sunt text UTF-8 valid, de exemplu o imagine sau date comprimate, instrumentul raportează conținutul ca binar în loc să afișeze caractere ilizibile. Modul ales rămâne în bara de adrese, sub forma ?mode=base64, așa că puteți partaja o legătură care deschide direct acest mod; intrarea dumneavoastră nu ajunge însă niciodată în URL.

Codarea URL, entitățile HTML și bazele numerice

Codor / Decodor are încă trei moduri pe lângă Base64. URL aplică textului percent-encoding: alegeți o singură valoare de interogare ori un segment de cale (encodeURIComponent, care escapează și &, = și /) sau o adresă întreagă (encodeURI, care păstrează caracterele ce o structurează). Alegerea corectă contează: dacă treceți o adresă completă prin encodeURIComponent, se codează și : și /, iar legătura devine inutilizabilă. La decodare, + poate fi tratat ca spațiu, așa cum îl trimit formularele HTML.

Entități HTML escapează cele cinci caractere care schimbă structura HTML (<, >, &, " și '), opțional și fiecare caracter non-ASCII, și decodează referințele numite și numerice. Bază de numerație convertește numere întregi de orice dimensiune între binar, octal, zecimal, hexazecimal și baza 36 fără rotunjire și acceptă prefixele 0x, 0o și 0b. Acest mod folosește BigInt, așa că se convertesc exact și valorile care nu încap în 64 de biți, ceea ce ajută la măști de biți, biți de permisiuni și identificatori mari.

Ce codare pentru ce sarcină
SarcinăMod
Date binare în JSON, e-mail sau un URI dataBase64
O valoare dintr-un șir de interogareURL, valoare de interogare
Afișarea unui text al utilizatorului în HTMLEntități HTML
Citirea unui dump hexazecimal sau a unei măști de bițiBază de numerație

Base64 standard și Base64url

Variantele Base64 (RFC 4648)
VariantăCaracterele 62 și 63PaddingFolosită în
Base64+ și /= obligatoriuE-mail MIME, URI-uri data, majoritatea API-urilor
Base64url- și _De obicei omisJWT-uri, URL-uri, nume de fișiere, WebAuthn

+ și / au înțelesuri speciale în URL-uri, iar = în șirurile de interogare, așa că un Base64 standard aflat într-un URL are nevoie și de percent-encoding. Base64url scutește de acest pas. Decodoarele scrise pentru o variantă resping de obicei cealaltă variantă, ceea ce explică eroarea frecventă „Base64 invalid” când o parte de JWT este lipită într-un decodor standard. Aceeași confuzie apare și în sens invers: o bibliotecă ce trece o valoare sigură pentru URL în alfabetul standard dă eroare de lungime dacă uită să adauge padding-ul.

Aceiași octeți în ambele variante
Standard: +/+/Pz8=
URL-safe: -_-_Pz8

Base64 nu este criptare

Base64 nu ascunde nimic. Oricine vede YWRtaW46c2VjcmV0 îl poate decoda într-o secundă în admin:secret, adică exact ceea ce conține un antet de autentificare HTTP Basic. Fișierele de configurare și jurnalele care păstrează parole „codate” în Base64 le păstrează, practic, în text clar. Ca să protejați cu adevărat un secret aveți nevoie de o cheie; codarea nu are nicio cheie, doar un alfabet pe care îl cunoaște toată lumea.

Secretele codate rămân secrete

Tratați datele de autentificare, cheile de API și token-urile codate în Base64 exact ca pe versiunile lor în clar. Nu lipiți valori reale în tichete, în conversații sau în instrumente publice și folosiți o criptare adevărată ori un manager de secrete ca să le protejați.
Antet de autentificare Basic
Authorization: Basic YWRtaW46c2VjcmV0
# decodes to admin:secret; only TLS protects it in transit

Unde întâlniți Base64

Locuri obișnuite în care apare Base64
LocCum aratăVariantă
Atașamente de e-mailBlocuri de linii de 76 de caractere sub Content-Transfer-Encoding: base64Standard, cu linii rupte
URI-uri datadata:image/png;base64,iVBORw0KGgo…Standard
JSON Web Token-uriTrei părți separate prin puncte, care încep cu eyJBase64url
Autentificare HTTP BasicAuthorization: Basic …Standard
Secrete KubernetesValorile din câmpurile data: ale manifestelor SecretStandard
Chei DKIM și certificateValoarea p= din înregistrările DKIM, blocurile PEMStandard
Subresource Integrityintegrity="sha384-…"Standard

Prefixul eyJ este un indiciu util: el este codarea Base64 a lui {", așa că șirurile care încep cu el sunt de obicei JSON codat, foarte des un JWT. La fel, fișierele PEM sunt Base64 între liniile -----BEGIN și -----END, iar URI-urile data conțin întotdeauna ;base64, înaintea conținutului. Aceste semne mici vă lasă să ghiciți varianta unui șir înainte de a-l decoda și vă scutesc de încercări inutile.

Secretele Kubernetes sunt exemplul cel mai cunoscut de Base64 confundat cu protecție. Valorile dintr-un manifest Secret sunt doar codate; oricine poate citi manifestul poate citi și secretul. Ceea ce le protejează cu adevărat sunt criptarea pe disc și controlul accesului în cluster. Aceeași neînțelegere se repetă atunci când variabilele de mediu sau copiile de configurare sunt trecute prin Base64 și considerate sigure.

Base64 în linia de comandă și în cod

Codare și decodare
# Linux / macOS
printf '%s' 'Hello' | base64          # SGVsbG8=
printf '%s' 'SGVsbG8=' | base64 --decode

# JavaScript (UTF-8 safe)
btoa(String.fromCharCode(...new TextEncoder().encode('Grüße')))

# Python
python3 -c "import base64; print(base64.urlsafe_b64encode(b'Hello').decode())"

Majoritatea limbajelor au Base64 în biblioteca standard, așa că rareori există un motiv să îl implementați singur. Fiți atent la varianta pe care o produce o funcție: multe biblioteci au funcții separate pentru Base64 standard și pentru cel sigur pentru URL, iar unele adaugă sau elimină padding-ul altfel. Când două sisteme nu se înțeleg asupra unei valori, comparați mai întâi varianta și padding-ul. Cel mai rapid mod de a face asta este să codați aceeași intrare de ambele părți și să puneți ieșirile alături, caracter cu caracter.

Funcția btoa a browserului lucrează numai cu șiruri Latin-1 și aruncă o eroare pentru alte caractere, motiv pentru care exemplul transformă întâi textul în octeți UTF-8. Sfârșiturile de linie sunt o altă capcană: unele instrumente rup ieșirea Base64 la 76 de caractere, așa cum cere MIME, iar alte decodoare refuză acele sfârșituri de linie. În propriul cod, curățarea spațiilor și a sfârșiturilor de linie înainte de decodare este cea mai simplă cale de a împăca cele două lumi.

Remedierea erorilor de decodare

De ce eșuează decodarea
SimptomCauzăRemediu
Caracter invalidIntrare Base64url într-un decodor standard sau spații rătăciteBifați varianta sigură pentru URL ori înlocuiți - și _ cu + și /
Lungime invalidăPadding-ul a fost eliminatAdăugați = până când lungimea este multiplu de 4 sau folosiți modul sigur pentru URL
Ieșire ilizibilăDatele sunt binare (imagine, comprimate, criptate)Salvați octeții într-un fișier în loc să îi citiți ca text
Diacritice greșiteTextul a fost codat în alt set de caractereDecodați cu codarea originală sau recodați ca UTF-8
Caractere în plus la începutUn prefix de URI data, precum data:image/png;base64,Ștergeți tot până la virgulă, inclusiv virgula

Pentru JWT-uri folosiți în schimb Decodor JWT, care împarte token-ul și decodează fiecare parte ca Base64url. Pentru valori din URL-uri, Codorul URL se ocupă de percent-encoding, precum %2B care apare când un + trece printr-un șir de interogare pe https://www.example.com/?token=. Folosite împreună, cele două instrumente vă ajută să distingeți dacă un token s-a stricat în transport sau chiar în conținutul lui.

Întrebări frecvente

Base64 este criptare?

Nu. Este o codare reversibilă, fără cheie. Oricine o poate decoda.

De ce ieșirea Base64 este mai lungă decât intrarea?

Fiecare 3 octeți devin 4 caractere, așa că dimensiunea crește cu aproximativ o treime, la care se adaugă padding-ul.

Ce sunt semnele = de la final?

Padding care face lungimea multiplu de 4. Un singur = înseamnă că ultimul grup a avut doi octeți, iar == înseamnă un octet.

Ce este Base64url?

O variantă care folosește - și _ în loc de + și / și omite de obicei padding-ul, astfel încât valorile să poată fi folosite în URL-uri și în nume de fișiere fără escapare.

Instrumentul tratează emoji și diacriticele?

Da. Textul este codat ca UTF-8 înainte de Base64, iar decodarea îl citește tot ca UTF-8.

Intrarea mea este încărcată undeva?

Nu. Codarea și decodarea au loc în browserul dumneavoastră.

Pot decoda o imagine?

Instrumentul afișează rezultate text. Un Base64 care se decodează în binar este raportat ca binar; salvați astfel de date într-un fișier cu un instrument din linia de comandă ca să le vedeți.

De ce textul meu decodat are caractere ciudate?

Textul original era probabil în altă codare de caractere sau datele sunt binare. Verificați cum a fost produs.

Base32 sau hexazecimal sunt mai bune decât Base64?

Ele schimbă dimensiunea contra lizibilitate. Hexazecimalul dublează dimensiunea, dar este simplu și nu ține cont de litere mari și mici; Base32 evită caracterele ambigue și problemele de capitalizare; Base64 este cel mai compact dintre cele trei.

De ce unele șiruri Base64 conțin sfârșituri de linie?

E-mailul MIME rupe Base64 la 76 de caractere pe linie. Eliminați sfârșiturile de linie înainte de a decoda cu instrumente care așteaptă o singură linie.

Ar trebui să înglobez imagini ca URI-uri data Base64?

Numai pe cele foarte mici. Base64 adaugă o treime la dimensiune și împiedică memorarea separată în cache; pentru orice depășește o pictogramă mică, fișierele de imagine obișnuite sunt mai bune.

Surse