ToolDeck

Base64

7 nástrojů

Co je kódování?

Kódování je proces převodu dat z jedné reprezentace do jiné. Ve vývoji webu se kódování používá k bezpečnému přenosu dat přes kanály navržené pro omezený rozsah znaků — například při odesílání binárních dat textovým protokolem nebo při vkládání speciálních znaků do URL.

Znakové kódování definuje, jak se textové znaky mapují na bajty. Kódování Base64 převádí binární data na ASCII text. Kódování URL zajišťuje, že libovolný text je bezpečný pro použití v adresách URL. Pochopení těchto tří vrstev kódování předchází záludným chybám a bezpečnostním zranitelnostem.

Historie znakového kódování

Znakové kódování je mapování znaků (písmen, symbolů) na jejich binární reprezentace. Vývoj od ASCII k Unicode odráží globalizaci webu:

ASCII1963
128 znaků

7bitový americký standardní kód. 128 znaků: anglická písmena, číslice, interpunkce a řídicí kódy. Definoval základní kódování, na němž ostatní staví.

Latin-11987
256 znaků

Rozšířené ASCII pro jazyky západní Evropy. Přidalo 128 znaků (písmena s diakritikou, symboly). Nevhodné pro nelatinkové písmo.

Unicode1991
149 186+ znaků

Univerzální znaková sada pokrývající všechny světové písemné systémy. Definuje kódové body pro více než 149 000 znaků ve 161 skriptech. Nedefinuje kódování — to je úkolem UTF-8/16/32.

UTF-81993
Celý Unicode znaků

Kódování Unicode s proměnnou šířkou využívající 1–4 bajty na znak. Kompatibilní s ASCII (prvních 128 kódových bodů je jednobytových). Dominantní kódování na webu — více než 98 % webových stránek.

UTF-161996
Celý Unicode znaků

Kódování s proměnnou šířkou využívající 2 nebo 4 bajty na znak. Používáno interně v systémech Windows, Java a v řetězcích JavaScriptu. Není kompatibilní s ASCII.

UTF-322000
Celý Unicode znaků

Kódování s pevnou šířkou: vždy 4 bajty na znak. Jednoduché, ale prostorově náročné. Používá se v některých databázových systémech. Na webu se vyskytuje zřídka.

Proč zvítězilo UTF-8

UTF-8 se prosadilo díky zpětné kompatibilitě s ASCII (prvních 128 znaků se kóduje identicky), samosynchonizaci (hranice znaků lze nalézt prohledáváním) a prostorové efektivitě pro latinský text. Každý dokument v ASCII je zároveň platným dokumentem UTF-8. To umožnilo bezproblémovou migraci.

Kódování Base64

Base64 převádí binární data na textovou reprezentaci za použití pouze 64 tisknutelných ASCII znaků: A–Z, a–z, 0–9, + a /. Je to nezbytné, když musí binární data procházet kanály, které zpracovávají pouze text — e-mailové přílohy, data URI, JWT tokeny i HTTP Basic Auth používají Base64.

Jak to funguje

Base64 rozděluje vstupní bajty do bloků po 3 bajtech (24 bitech) a každý blok zakóduje jako 4 znaky Base64 (po 6 bitech). Pokud vstup není násobkem 3 bajtů, jsou na doplnění posledního bloku přidány znaky = pro zarovnání:

VstupHex bajtyBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

Znaky = pro zarovnání na konci výstupu udávají, kolik bajtů chybělo k dokončení posledního tříbytového bloku. Jeden = znamená, že byl potřeba jeden bajt zarovnání; == znamená dva bajty. Standardní Base64 vždy produkuje výstup, jehož délka je násobkem 4.

Kódování URL

Adresy URL mohou obsahovat pouze omezený rozsah bezpečných ASCII znaků. Jakýkoli znak mimo tento rozsah — včetně mezer, interpunkce, znaků mimo ASCII a speciálních znaků URL jako &, = a # — musí být před vložením do URL zakódován procentovým kódováním (URL-encoded).

Procentové kódování nahrazuje každý nebezpečný bajt znakem % následovaným dvěma hexadecimálními číslicemi vyjadřujícími hodnotu tohoto bajtu. Mezera se stane %20, ampersand se stane %26 a tak dále.

Běžně kódované znaky

ZnakZakódovánoPoznámky
Space%20Nejčastější; v odeslaných formulářích se v application/x-www-form-urlencoded používá jako +
&%26Oddělovač parametrů v dotazovém řetězci; musí být zakódován při použití jako literální hodnota
=%3DOddělovač klíče a hodnoty v dotazovém řetězci; kódovat při použití jako data
+%2BV application/x-www-form-urlencoded interpretován jako mezera; kódovat pro zachování literálního +
#%23Identifikátor fragmentu; kódovat při použití jako literální data v cestě nebo dotazu
/%2FOddělovač segmentů cesty; kódovat při použití jako literální data, nikoli jako oddělovač cesty
:%3AOddělovač schématu; kódovat v kontextu cesty a dotazu
@%40Používá se v mailto: a autentizaci; kódovat při použití jako literální data

encodeURI vs encodeURIComponent

JavaScript poskytuje dvě kódovací funkce s různým rozsahem působnosti. encodeURI kóduje celou URL adresu — nechává nezakódované znaky, které mají v URL zvláštní význam (:, /, ?, #, @). encodeURIComponent kóduje komponentu URL (hodnotu jednoho parametru dotazu nebo segment cesty) — zakóduje všechny znaky kromě A–Z, a–z, 0–9, -, _, ., ~. Pro jednotlivé hodnoty vždy používejte encodeURIComponent a pro celé URL adresy encodeURI.

Kde se kódování ve vývoji webu vyskytuje

HTTP Basic autentizace

Hlavička Authorization: Basic kóduje přihlašovací údaje jako Base64(uživatelské_jméno:heslo). Jde o kódování pro pohodlí při přenosu, NIKOLI o zabezpečení — Base64 je triviálně reverzibilní. S Basic Auth vždy používejte HTTPS.

Data URI

Data URI vkládají obsah souborů přímo do HTML nebo CSS: data:image/png;base64,.... Vkládání obrázků a fontů jako Base64 eliminuje HTTP požadavky za cenu zvětšení dokumentu (přibližně 33% režie).

E-mailové přílohy MIME

E-mail byl navržen pro 7bitové ASCII. Binární přílohy (obrázky, PDF soubory) jsou před odesláním zakódovány protokolem MIME do Base64. Váš e-mailový klient je při zobrazení e-mailu transparentně dekóduje.

JWT tokeny

JWT tokeny používají pro všechny tři části (hlavičku, datovou část a podpis) kódování Base64url — variantu, která nahrazuje + za - a / za _ a vynechává zarovnání. Díky tomu jsou tokeny URL-safe bez nutnosti dalšího procentového kódování.

Parametry dotazovacího řetězce

Veškerá uživatelská data v dotazovacích řetězcích URL musí být procentově zakódována. Nezakódování & nebo = v hodnotě tiše poškodí zpracování dotazovacího řetězce. Pro jednotlivé hodnoty vždy používejte encodeURIComponent.

Internacionalizované doménové názvy

Doménové názvy obsahující znaky mimo ASCII (např. münchen.de) jsou zakódovány pomocí Punycode (předpona xn--) pro kompatibilitu se systémem DNS. Prohlížeč zobrazuje tvar Unicode, ale DNS resolveru odesílá tvar Punycode.

Časté dotazy

Je Base64 forma šifrování?

Ne. Base64 je kódování, nikoli šifrování. Jde o reverzibilní transformaci bez tajného klíče. Každý, kdo vidí řetězec Base64, ho může okamžitě dekódovat. Nikdy nepoužívejte Base64 jako bezpečnostní opatření.

Proč výstup Base64 někdy končí ==?

Base64 zpracovává vstup v blocích po 3 bajtech. Pokud vstup není násobkem 3 bajtů, jsou pro doplnění posledního bloku přidány znaky = pro zarovnání. Jeden = znamená jeden bajt zarovnání; == znamená dva. Některé implementace zarovnání vynechávají (Base64url pro JWT).

Jaký je rozdíl mezi Base64 a Base64url?

Base64url je URL-safe varianta Base64, která nahrazuje + za - a / za _ a typicky vynechává zarovnání =. Díky tomu ji lze bezpečně používat v URL adresách a HTTP hlavičkách bez procentového kódování. JWT používá Base64url pro všechny tři části.

Kdy použít encodeURI vs encodeURIComponent?

encodeURIComponent používejte pro jednotlivé hodnoty (hodnoty parametrů dotazu, hodnoty segmentů cesty). encodeURI používejte pro celý řetězec URL, kde chcete zachovat strukturální znaky URL (/, :, ?, #). V případě pochybností použijte encodeURIComponent.

Proč je UTF-8 pro web lepší než UTF-16?

UTF-8 je kompatibilní s ASCII a prostorově efektivní pro latinský text (většina URL adres, HTML tagů a kódu je ASCII). UTF-16 plýtvá místem u obsahu v ASCII a není zpětně kompatibilní. HTTP a HTML standardně používají UTF-8.

Co je procentové kódování?

Procentové kódování (URL encoding) reprezentuje znaky jako % následované dvoucifernou hexadecimální hodnotou bajtu. Například mezera je %20 (desítkově 32, šestnáctkově 20). Vícebytové znaky UTF-8 kódují každý bajt zvlášť: é je %C3%A9.

Ovlivňuje kódování výkon?

Base64 zvyšuje velikost dat přibližně o 33 % a přidává CPU režii při kódování a dekódování. Pro systémy s vysokou propustností preferujte binární protokoly. URL kódování přidává minimální režii, ale při mnoha speciálních znacích může URL výrazně prodloužit.

Co je Punycode?

Punycode je kódování pro reprezentaci znaků Unicode v systému DNS kompatibilním s ASCII. Internacionalizované doménové názvy jako münchen.de jsou v DNS dotazech zakódovány jako xn--mnchen-3ya.de. Prohlížeče zobrazují tvar Unicode, ale interně používají Punycode.