Ghid pentru Codor / Decodor
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.
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
- Deschideți Codor / Decodor.
- Alegeți Codifică pentru a transforma textul în Base64 sau Decodează pentru a transforma Base64 în text.
- Bifați „Alfabet sigur pentru URL” pentru Base64url, care folosește
-și_și renunță la padding. - 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.
| Sarcină | Mod |
|---|---|
| Date binare în JSON, e-mail sau un URI data | Base64 |
| O valoare dintr-un șir de interogare | URL, valoare de interogare |
| Afișarea unui text al utilizatorului în HTML | Entități HTML |
| Citirea unui dump hexazecimal sau a unei măști de biți | Bază de numerație |
Base64 standard și Base64url
| Variantă | Caracterele 62 și 63 | Padding | Folosită în |
|---|---|---|---|
| Base64 | + și / | = obligatoriu | E-mail MIME, URI-uri data, majoritatea API-urilor |
| Base64url | - și _ | De obicei omis | JWT-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.
Standard: +/+/Pz8=
URL-safe: -_-_Pz8Base64 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
Authorization: Basic YWRtaW46c2VjcmV0
# decodes to admin:secret; only TLS protects it in transitUnde întâlniți Base64
| Loc | Cum arată | Variantă |
|---|---|---|
| Atașamente de e-mail | Blocuri de linii de 76 de caractere sub Content-Transfer-Encoding: base64 | Standard, cu linii rupte |
| URI-uri data | data:image/png;base64,iVBORw0KGgo… | Standard |
| JSON Web Token-uri | Trei părți separate prin puncte, care încep cu eyJ | Base64url |
| Autentificare HTTP Basic | Authorization: Basic … | Standard |
| Secrete Kubernetes | Valorile din câmpurile data: ale manifestelor Secret | Standard |
| Chei DKIM și certificate | Valoarea p= din înregistrările DKIM, blocurile PEM | Standard |
| Subresource Integrity | integrity="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
# 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
| Simptom | Cauză | Remediu |
|---|---|---|
| Caracter invalid | Intrare Base64url într-un decodor standard sau spații rătăcite | Bifați varianta sigură pentru URL ori înlocuiți - și _ cu + și / |
| Lungime invalidă | Padding-ul a fost eliminat | Adă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șite | Textul a fost codat în alt set de caractere | Decodați cu codarea originală sau recodați ca UTF-8 |
| Caractere în plus la început | Un 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.