© 2013 All rights reserved.
0

Hashovací funkce, kódování dat

Hashovaní funkce a různé způsoby kódování dat musí být nepostradatelnou součástí zabezpečení každého webu, na kterém jsou citlivé informace, které se snažíme nějakým způsobem chránit.

Funkce pro to určené jsou důležitou součástí nejen zabezpečení webu, ale setkáváme se s nimi téměř na každém kroku i v obyčejném životě a mnohdy si to ani neuvědomujeme – elektronický podpis, zadávání hesla do programů, apod.

Oproti ostatním jazykům má však PHP značnou nevýhodu. Hesla se zpracovávají až na straně serveru, nemohou být zpracovány již na straně klienta, a právě zde jsou zranitelná. Hesla se musí nějakým způsobem přenášet od klienta na server a kdokoliv může takto přenášená hesla odchytit a přečíst.

Aby nebylo možné heslo odchytit je nutno zajistit bezpečnou komunikaci mezi serverem v internetu a uživatelovým prohlížečem – například šifrovaný přenos prostřednictvím bezpečnějšího protokolu. Pomocí tohoto protokolu můžeme přenášet data sice šifrovaně, ale i tak je nutné hashovací funkce používat pro ochranu dat, které jsou uloženy v databázi nebo na serveru, protože tady jsou data nejzranitelnější.

Přední z důvodu proč se hashovací a šifrovací funkce používají je tedy bezpečnost. Pokud by se útočník dostal do naší databáze, nebyl by pro něj problém si přečíst všechna data, která potřebuje pro vniknutí do našeho systému, nebo chce odcizit. Pokud data dostatečně zabezpečíme, snižujeme možnost taková data přečíst.

Další otázky, které vás mohou napadnout ve spojitosti s tímto tématem mohou být například:

Jak hashovací a šifrovací funkce pracují?

Budou zašifrovaná data v bezpečí i když se k nim útočník dostane?

Které funkce by jsem měl použít, které jsou nejbezpečnější?

A právě tyto otázky se budeme snažit zodpovědět.

Jednosměrné hashovací funkce v PHP

Pojmem jednosměrné (one-way) hashovací funkce rozumíme takové funkce, u kterých po vygenerování otisku na základě vstupních dat nejsme schopni vygenerovat zpět vstupní řetězec, který byl zadán jako vsputní parametr této funkce.

Jinak řečeno, pokud použijeme tuto funkci na řetězec, neměli bychom být schopní z hashe řetězce dostat nazpět zadaný řetězec.

Další důležitou vlastností kvalitní hashovací funkce je co možná nejmenší pravděpodobnostní hranice vyvolání kolizí.

Kolize je vlastnost, kdy dva rozdílné vstupní řetězce dat vyůstí ve stejný otisk. Tomuto se snaží každá hashovací funkce zabraňovat. Pokud nedokáže zabránit kolizím, nemůže být dobře použitelná žádné aplikaci.

Představme si takovou kolizní funkci v praxi. Pokud by dva uživatelé měli různá hesla k našemu systému, a obě by generovala stejný hash, potom by mohlo docházet k přihlášení jenom na jeden účet, ať by se přihlašoval kterýkoli z uživatelů. Taková vlastnost je nepřípustná pro jakkoli důležitou věc.

Každá taková funkce (v PHP nejpoužívanější hashovací funkce: MD5, SHA-1) tedy generují na základě vstupních dat jejich jedinečný otisk. Tento otisk musí být pro každé dva shodné řetězce po využití stejného hashovacího klíče a stejné hashovancí funkce stejný, jinak by nám byl takový otisk k ničemu a nemohli bychom jej využít.

Jestliže chcete používat hashovací funkce v PHP musíte mít nainstalovanou knihovnu mhash, která obsahuje několik základních hashovacích funkcí:

  • MHASH_MD5
  • MHASH_SHA1
  • MHASH_HAVAL256
  • MHASH_HAVAL192
  • MHASH_HAVAL160
  • MHASH_HAVAL128
  • MHASH_RIPEMD160
  • MHASH_GOST
  • MHASH_TIGER
  • MHASH_CRC32
  • MHASH_CRC32B

Mezi nejrozšířenější funkce v PHP patří mezi programátory bezezporu první dvě – MD5 a SHA-1, které se hojně využívají právě k ochraně uživatelských hesel, nebo jiných důležitých informací.

Práce s hašovacími funkcemi

Práce s těmito funkcemi je v PHP velmi jednoduchá. Stačí znát pouze řetězec, u kterého chcete pomocí funkce vytvořit otisk a máte v podstatě dvě možnosti, jak hashovací funkce používat.

Nejprve si ukážeme použití funkce mhash, která má dva vstupní parametry:

První vstupní parametr je argument hash, který reprezentuje hash funkci, použitou na řetězec string. Druhý parametr data je potom řetězec dat, u kterých chceme vytvořit otisk. Může být přidán ještě nepovinný parametr key.

Jako parametr hash můžeme vybrat jednu z hashovacích funkcí obsažených v knihovně mhash.
Tedy například pro funkci MD5 bude funkce formulována takto:

Pokud by jste si ovšem nechali vypsat návratovou hodnotu funkce, všimli by jste si určitě že vrací sekvenci nesmyslných znaků. Je to způsobeno tím, že funkce vrací binární data. Proto je nutné ještě převést tyto binární data na hexadecimimální. K tomu nám pomůže funkce bin2hex, která je standartně obsažena v PHP:

Nyní dostáváme na výstupu konečně pro nás použitelný formát dat:

Samozřejmě by nebyl problém pracovat i s binárními daty, ale hexadecimální soustava je pro většinu programátorů přívětivější a praktičtější.

Druhá možností, jak používat hashovací funkce, je použití volání přímo konkrétní funkce (jedná se o alias k funkci mhash):

Tedy například pro md5 a sha1:

Dostaneme přímo výstu:

Volání funkcí pomocí mhash musí být s voláním přímo funkce na výstupu stejné. Což si můžeme ověřit na příkladu:

Při použití jakéhokoli řetězce pro proměnnou string se musí vypsat OK.

Obdobně musí fungovat i další funkce:

Používání hashovacích funkcí je tedy velmi jednoduché a nic nám už nebraní se podívat na některé funkce podrobně, ale to až v dalším článku.

Comments are closed for this page

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836