Čo je Base64?
Base64 prepisuje bajty pomocou šesťdesiatich štyroch čitateľných znakov, aby dáta prežili kanál postavený pre text: telo e-mailu, reťazec JSON, atribút XML, URL. Každé tri bajty sa zmenia na štyri znaky, odtiaľ je názov — abeceda má šesťdesiatštyri symbolov a každý nesie presne šesť bitov.
Je to prenosové kódovanie, nie bezpečnostné opatrenie a nie krok kompresie. Výstup je zhruba o tretinu väčší než vstup a ktokoľvek, kto má reťazec, ho vie hneď vrátiť späť. Ak treba zistiť, či sa dáta zmenili, je to hash (Generátor hashov); ak majú zostať tajné, je to šifrovanie. Base64 nerobí ani jedno.
Jediné číslo na zapamätanie: tri vstupné bajty sa zmenia na štyri výstupné znaky. Všetko ostatné na tejto stránke z toho vyplýva. Štyri znaky nesú dvadsaťštyri bitov a dvadsaťštyri bitov je presne tri bajty, takže sa dáta nikdy nestratia ani nevymyslia — okrem úplného konca, kde vstup nemusí zaplniť poslednú trojicu.
Päť abecied, ktoré môže táto stránka použiť
Prvé dva riadky sú štandardy a posledné tri sú konvencie, ktoré vznikli okolo Unixu. Všetkých päť nesie na znak rovnakých šesť bitov a líšia sa len tým, ktorých šesťdesiatštyri znakov nesú, takže rovnaké bajty sa zmenia na päť rôznych reťazcov. Nič v reťazci nehovorí, ktorá abeceda ho vytvorila, preto je výber abecedy predvolene štandardný a políčko bezpečné pre URL je skratka pre druhý riadok.
Ako stránka vyberá kandidáta: prepínač je predvolený pre oba smery. Pri dekódovaní panel vpravo číta aj samotný reťazec — - a _ môžu pochádzať len z abecedy bezpečnej pre URL, + alebo / len zo štandardnej a / alebo . blízko začiatku poukazuje na dve abecedy Unixu. Každá abeceda, ktorá môže prečítať aktuálny vstup, je tam uvedená s dôvodom, prečo je alebo nie je kandidátom.
Zalamovanie riadkov: 76 a 64 znakov
MIME vyžadovalo Base64, ktoré sa zmestí do e-mailu bez nerozumne dlhých riadkov, a ustálilo sa na 76 znakoch na riadok oddelených CRLF. Súbory PEM, ktoré obaľujú certifikáty a kľúče, používajú 64. Zalomenia riadkov nie sú súčasťou dát: dekodér ich odstráni a riadky spojí dokopy skôr, než urobí čokoľvek iné, takže zalomený a nezalomený reťazec sa dekódujú na presne tie isté bajty. Každý riadok okrem posledného obsahuje celý počet štvorznakových skupín, čo robí ich spájanie bezpečným.
Táto stránka ponecháva výstup na jednom riadku, pokiaľ sa nezvolí šírka, a dekodér prijíma vstup so zalomeniami aj bez nich. Zalomenia, ktoré táto stránka zapisuje, sú obyčajné nové riadky, čo dokáže textové pole udržať; telá e-mailov MIME tradične používajú pred každým novým riadkom návrat vozíka a každý používaný dekodér prijme oboje.
Výplň a prečo sa môže vynechať
Ak vstup nie je násobkom troch bajtov, posledná skupina štyroch znakov je neúplná a jeden alebo dva znaky = ju doplnia. Nenesú žiadne dáta: len hovoria, koľko zo štyroch znakov je skutočných. Dekodér to vie zistiť aj z dĺžky, preto sa Base64 bezpečné pre URL tradične píše bez výplne — = je v URL alebo v názve súboru nepríjemné a niektoré systémy ho percent-kódujú.
Políčko v riadku možností zachová výplň pri výbere abecedy bezpečnej pre URL. Inak sa nič nemení; znaky, ktoré nesú dáta, sú v oboch prípadoch rovnaké.
Časté nedorozumenia
- „Base64 skrýva dáta.“ Nie. Je to substitúcia bez kľúča a celý zmysel je v tom, že ju ktokoľvek môže vrátiť späť. Zabalenie hesla alebo tokenu do Base64 nezmení nič na tom, kto ich môže prečítať.
- „Base64 komprimuje.“ Opak je pravdou: každé tri vstupné bajty sa zmenia na štyri výstupné znaky, takže text je o tretinu väčší než dáta, ktoré nesie.
- „Zalomenia riadkov sú súčasťou hodnoty.“ Sú to len úpravy zobrazenia. Pridanie alebo odstránenie nikdy nezmení bajty, ktoré sa vrátia.
- „Bezpečné pre URL znamená iné kódovanie.“ Je to to isté kódovanie s dvoma vymenenými znakmi:
+ sa zmení na - a / na _, takže reťazec môže byť v ceste URL alebo v hodnote dotazu bez escapovania.
- „Reťazec, ktorý sa dá dekódovať, musí byť platný Base64.“ Každý reťazec znakov abecedy je platný Base64, pretože každá kombinácia šesťbitových hodnôt je platná postupnosť bajtov. Reťazec sa ukáže ako chybný až v ďalšom kroku, keď sa tie bajty skontrolujú voči formátu, ktorý mali predstavovať.
- „Výplň prezradí, ktorá abeceda sa použila.“ Nie, a vo väčšine prípadov to nerobia ani znaky: štandardná a bezpečná abeceda sa zhodujú v šesťdesiatich dvoch zo šesťdesiatich štyroch symbolov, takže krátky reťazec sa často číta rovnako v oboch.
Otázky, ktoré vznikajú
Prečo reťazec Base64 niekedy končí jedným = a inokedy dvoma? Jeden znamená, že posledná skupina nesie tri skutočné znaky, teda dva vstupné bajty; dva znamenajú, že nesie dva, teda jeden vstupný bajt. Žiadny = znamená, že dĺžka vstupu bola násobkom troch.
Dokáže Base64 zobraziť ľubovoľné binárne súbory? Áno, a to je jeho hlavné použitie. Táto stránka berie vstup ako text UTF-8; špecializovaný nástroj Súbor do Base64 číta surové bajty, keď sa má zakódovať niečo, čo nie je text.
Ktorú abecedu použiť v API? Tú, ktorú dokumentuje prijímajúca strana. Ak uvádza bezpečnú pre URL, použije sa tá; ak nič neuvádza a hodnota putuje v URL, najbezpečnejšou voľbou je bezpečná pre URL s vynechanou výplňou.
Rozlišuje výstup veľkosť písmen? Úplne. a a A sú rôzne hodnoty, a preto Base64 znesie preklep v znaku oveľa menej elegantne než Base32 alebo Crockford Base32.