Po delší době budu zase nadávat. Jednou za uherský rok člověk vleze na (L)živě.cz a dozví se takové věci, jako že třeba SHA-1 je šifrovací algoritmus. Redaktoři bohužel evidentně mají nutkání psát o něčem, o čem ví pendrek, ale to jim vůbec nevadí, ba právě naopak. Proč mi připadá, že v našich končinách je tato neprofesionalita tak nějak v definici?
Aby bylo jasno, šifrování a hashování (čti hešování) jsou dvě odlišné věci. Ze šifrování je totiž cesta zpátky. Následující odstavce jsou jen takové drobné ujasnění, co je šifrování a co je hashování, protože mnoho lidí v tom má nepořádek a pletou to. Více informací je samozřejmě na Wikipedii, tohle není nic podrobného, jen takový velmi stručný přehled.
U šifrování máte buď jeden klíč (symetrická šifra), kterým se zpráva zašifruje, a pak zase dešifruje, anebo máte dva klíče (asymetrická šifra), kdy se zpráva jedním klíčem zašifruje a druhým zase dešifruje, přičemž ty dva klíče se generují zároveň a když máte jeden, tak nejste schopni vymyslet ten druhý.
Nejznámější symetrické šifrovací algoritmy jsou DES (dnes již nepoužívat, superpočítače jsou příliš výkonné a dá se to lousknout), TripleDES (trojnásobná aplikace DESu, není o moc lepší) a AES (dnes hojně používaný a bezpečný). Nejznámější šifrovací algoritmus je RSA.
U symetrických šifrovacích algoritmů je zásadním problémem to, aby obě strany měly stejný klíč. Ten je potřeba nějak bezpečně dopravit. Pro to se často využívají asymetrické šifry - jedna strana vygeneruje dva klíče pro asymetrickou šifru a jeden z nich (říká se mu veřejný) pošle druhé straně. Ten může po cestě někdo zachytit, ale to nevadí. Druhá strana vymyslí třetí klíč, zašifruje ho veřejným klíčem, který dostala, a pošle zpátky první straně. I tohle může útočník odchytit, ale to nevadí, protože nemá první (soukromý) klíč, aby zprávu rozluštil. Jakmile první strana dostane zprávu, rozšifruje ji (má soukromý klíč) a pak už komunikují symetricky, protože asymetrické šifrování je pomalé a nepoužitelné pro větší objemy dat.
Hashování je něco úplně jiného, z jakýchkoliv dat můžete udělat tzv. otisk, což je většinou posloupnost bajtů nějaké pevné délky. Vtip je v tom, že není snadné (jinak než hrubou silou) najít dva vstupy tak, aby měly stejný otisk, případně k jednomu danému vstupu najít druhý se stejným otiskem. Z otisku nejde získat zpět původní data!
K čemu se otisky používají? Například pro ukládání hesel do databáze. Pokud chcete (a měli byste) zachovat soukromí uživatelů, do databáze neuložíte heslo, ale jeho hash (otisk). Nejde z něj zjistit heslo původní, ale to nevadí - pro ověření uživatele stačí heslo zadané uživatelem zahashovat a pokud budou otisky stejné, jsou stejná i hesla (na 99,99999999999999999999%; ty devítky někde končí, nejdou do nekonečna). Aby byla bezpečnost ještě větší (pokud by dva uživatelé měli stejné heslo, dalo by se to poznat), používá se technika hashování se solí. Ke každému uživateli si uložíte náhodný řetězec (tzv. sůl) a před hashováním jí přidáte před heslo. Protože každý uživatel má sůl jinou, otisk bude i při stejných heslech jiný.
Nebo se to dá využít pro podepisování a ochranu údajů proti změně. Pokud chcete někam uložit nějaká data a potřebujete, abyste poznali, že je někdo změnil, můžete je opět podepsat. Stačí mít nějakou sůl (opět náhodný řetězec), kterou znáte jen vy, tu přidat před data a zahashovat. Pokud někdo změní data, otisk nebude podpis pro ta data, když zkusíte data se stejnou solí zahashovat, vyjde něco jiného. Útočník nemůže změnit data tak, aby otisk zůstal (opět by to byla kolize hashovacího algoritmu), a nemůže data podepsat sám, protože nezná sůl.
Známé hashovací algoritmy (nebo jejich sady) jsou např. MD5 (dnes se jí již nevěří), SHA-1 (také už moc ne) a SHA-2, do níž patří často používané SHA-512, což je dnes obecně podporovaná a bezpečná hashovací funkce. Pokud tedy budete chtít něco hashovat, zvolte nejlépe SHA-512, která je zatím bezpečná.