© 2013 All rights reserved.
0

Kryptografie, kódování dat

Kryptografie, neboli šifrování dat, je nauka o transformování dat do podoby, která je čitelná jenom s určitou znalostí. Slovo Kryptografie pochází z řečtiny – kryptós (je skrytý) a gráphein (psát).

Pojem kryptografie

Na úvod si řekneme něco o pojmu kryptografie:

Kryptografie, neboli šifrování dat, je nauka o transformování dat do podoby, která je čitelná jenom s určitou znalostí. Slovo Kryptografie pochází z řečtiny – kryptós (je skrytý) a gráphein (psát).

Často je pojem zaměňován, nebo používán, pro vědu o šifrách – kryptologii.

Kryptografie se vyvíjí již celá staletí, nebo tisíciletí. V historii postupně vznikali lepší a důmyslnější šifry, které často ovlivnili mnohé historické události (zejména jednalo li se o utajování a vyzrazování informací).

Taková jednoduchá šifra by mohla vypadat takto:

kde jsme jenom posunuli znaky v abecedě. Nicméně na výstupu dostaneme řetězec
xsxsniqsniwmjvszeredtveze, který se zdrojové zprávě nepodobá ani přinejmenším.

Takový je význam šifer a šifrování.

V PHP se kódování využívá nejčastěji pro zakódování informací, které chceme ochránit (například platy zaměstnanců, a podobné citlivé informace), ale může se používat i například pro generování kontrolních součtů souborů.

Použití kódování dat nám zajišťuje vyšší bezpečnost, ale může způsobit i pocit falešného bezpečí, takže na to musíme dávat pozor.

Většina funkcí pro kódování dat je v knihovnách mcrypt a mhash.

Kódování

Ve své podstatě existují dva druhy kódování: asymetrický (s veřejným klíčem) a symetrické (s tajným klíčem).

  • symetrická kryptografie: při symetrickém kódování je potřeba tzv. klíče. Klíč je určitá hodnota (informace), podle niž dojde k zakódování textu. V příkladu, který zde byl uveden, je takový klíč číslo 4. Klíč může být ovšem i větších rozměrů: 4 -> 6 -> 2. Volání by potom vypadalo takto:

  • pokud chceme potom text rozkódovat, potřebujeme stejný klíč a výsledný zašifrovaný řetězec. Jinak bychom neměli být schopni z šifrovaného textu dostat zdrojový text. Výhodou tohoto šifrování je její rychlost a využívá se pro šifrování dat, která již dále neputují, například dokumenty na svém počítači. Jako nevýhodu můžeme uvést klíč, který je potřeba pro výměnu takových informací.
    Pokud bychom chtěli s někým komunikovat, musíme mu nějak sdělit náš klíč.
  • asymetrická kryptografie: asymetrická kryptografie se od symetrické liší právě použitím klíčů. Používá totiž jeden klíč pro zašifrování a jiný klíč pro dešifrování. Takové dva klíče se nazývají keypair. Klíč pomocí něhož se šifruje se potom nazývá veřejný (public) klíč a klíči pro dešifrování říkáme soukromý (private) klíč. Při práci máme k dispozici dva klíče, přičemž veřejný klíč znají všichni, kdo s námi chtějí tajně komunikovat a soukromý klíč znáte jenom vy. Tím pádem odpadá problém při předávání klíče, ale můžeme jej v klidu rozesílat internetem. Útočník, který by jej odchytil by získal jenom veřejná všude známý klíč, který by mu k ničemu nebyl.

Pokud tedy budete chtít využívat šifrování v PHP, budete potřebovat knihovnu mcrypt nebo mhash. Tyto dvě knihovny obsahují celou spoustu algoritmů, ze kterých si můžete vybrat pro vás ten nejlepší. Uvedu příklad z knihovny mcrypt.

  • MCRYPT_3DES
  • MCRYPT_DES
  • MCRYPT_TripleDES
  • MCRYPT_ENIGMA
  • MCRYPT_IDEA
  • MCRYPT_RIJNDAEL_256
  • MCRYPT_RC6
  • MCRYPT_SAFER128
  • MCRYPT_SERPENT_256
  • MCRYPT_THREEWAY
  • MCRYPT_TWOFISH256

a mnohé další.

Bohužel mnohé z těchto algoritmů nejsou dostatečně bezpečné, proto je důležité si správně vybrat. Míra zabezpečení závisí taky na velikosti klíče, který je použit. Uvědomte si, že klíč o velikosti 43 bitů je dvakrát tak účinný a trvalo by dvojnásobnou dobu jej prolomit útokem typu Brute Force (klíč má dvojnásobný počet kombinací) než klíč s velikostí 42 bitů.

V PHP má kódování uplatnění hlavně při předávání informací, ať už mezi serverem a klientem, nebo mezi servery. Míra důležitosti informace by se neměla podceňovat.

K použití algoritmů můžete zase využít funkci mcrypt. Před použitím musíte ovšem znát algoritmus kódování, který chcete použít, režim, ve kterém chcete kódovat, a konstantu, která udává co chcete s daným řetězcem dělat.

Jako algoritmus uvádíme název algoritmu uvedený v knihovně mcrypt.
Režim, je způsob, který se bude brát v ohled při kódování. U funkce mcrypt můžete použít několik různých režimů:

  • EBC: tento režim se používá nejčastěji pro kódování malých objemů dat. Tento způsob ale není moc bezpečný.
  • CBC: univerzální režim. Používá se pro kódování jak malých dat, tak i větších souborů. Je mnohem bezpečnější než EBC.
  • CBF: pro datové bitové proudy.
  • OFB: režim je podobný režimu CBF, ale může být použita v aplikacích, kde nesmí být tolerovány chyby.
  • NOFB: je režim podobný OFB, ale je bezpečnější.
  • STREAM: je speciální režim.

Pokud jde o konstanty, na výběr máte z pěti různých:

  • MCRYPT_ENCRYPT
  • MCRYPT_DECRYPT
  • MCRYPT_DEV_RANDOM
  • MCRYPT_DEV_UNRANDOM
  • MCRYPT_RAND

Každá z nic má jiné využití.

A výsledná funkce může vypadat takto:

Pokud tento skript spustíme, dostaneme jenom směsici nesmyslných znaků, které nedávání smysl. Jsou to binární data, které funkce mcrypt vrací. Pro normální použítí, například í v SESSION, nebo COOKIES proměnných je ovšem potřeba data ještě upravit a nepoužívat jejich binární podobu. Můžeme použít funkci bin2hex, nebo klidně třeba funkci urlencode, abychom převedli binární znaky do podoby, kterou je schopen server zpracovávat a předávat.

Pro dekódování tímto způsobem musíme použít stejný režim jako pro kódování, ale s konstantou MCRYPT_DECRYPT:

Podle nastavení serveru můžete dostat na výstupu warning:

Parser vás varuje, že jste použili prázdný Inicializační Vektor (IV), což nedoporučuje.
Inicializační vektor se generuje z určitých vstupních dat a pokud nemá druhá strana stejný inicializační vektor, nemělo by se jí podařit data dekódovat, takže se jedná o další možné zabezpečení.

Pokud bychom chtěli vytvořit skript pro kódování s inicializačním vektorem, mohl by vypadat nějak takto:

Vytvoříme třídu, která se bude používat jak pro kódování, tak dekódování:

Ve volání konstruktoru se nejprve nastaví hodnoty jako je: režim kódování, algoritmus, pomocí něhož se kóduje a potřebný klíč.

Po vytvoření nové instance třídy můžeme ještě vytvořit hash klíče, pro větší bezpečnost, a zavolat příslušnou obslužnou funkci, přičemž máme na výběr ze dvou: encrypt (pro zakódování) a decrypt (pro dekódování).

Takové volání potom může vypadat následovně:

Bohužel na některých serverech nemusí fungovat konstanta MCRYPT_DEV_RANDOM, ale budete ji muset nahradit konstantou MCRYPT_RAND. Před jejím použitím musíte ale nastartovat generátor náhodných čísel:

a při vytváření inicializačního vektoru je nutno nahradit konstantu MCRYPT_DEV_RANDOM konstantou MCRYPT_RAND:

Je nutné si uvědomit, že pokud má útočník přístup na server, má přístup i k vašemu klíči. Pokud tedy vytváříte inicializační vektor, pak mu alespoň přiděláte trochu práce.

Pokud chcete svá data opravdu zabezpečit tak aby se k nim opravdu nikdo nedostal, pak vám nezůstane žádná jiná možnost, než používat vlastní server, ke kterému nemá kromě vás nikdo jiný přístup, nebo data nevystavovat na internetu. Až pak budou data možná v bezpečí. Pokud budete využívat cizí hosting, nemůžete mít nikdy stoprocentní jistotu, že vaše data nikdo nečte.

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