(NE)bezpečnost MD5 ( uchovávání hesel )
Úvod
Tento článek je psán v návaznosti na můj předešlý článek ohledně hledání ideálního hesla.
S velkou pravděpodobností, každý z Vás co nyní čtete tento článek jste účastníkem nějakého fóra na bázi phpBB – tento systém využívá, jako mnoho ostatních systémů hodně rozšířené ( často používané ) hashovací funkce MD5 , která vytváří kontrolní součet velikosti 128bitů s otiskem. MD5 je jako taková zahrnuta a popsána v internetovém standardu RFC 1321 a prosadila se dále do mnoha aplikací, např. pro kontrolu integrity souborů, nebo ukládání hesel o což mi v tomto článku jde především. MD5 je rovněž jako funkce implementována do jazyku PHP, ve kterém je lehce implementovatelná, třeba takto:
<html>
<head>
<meta http-equiv="Content-Language" content="cs">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>•MD5• By Ondrej Baar</title>
</head>
<form method="post">
<input name="slovo" class="formular">
<input name="okej" type="submit" class="formular" value=" OK ">
</form>
<?php
if (isset($_POST['okej'])):
$ slovo = <b><B>MD5</B> </b>($_POST[' slovo ']);
echo $ slovo;
?>
</html>
Proč je MD5 nebezpečná?:
Algoritmus MD5 vznikl v roce 1991 vytvořil jej Ronald Rivestem, aby nahradil, dosud používanou funkci MD4. V roce 1996 však byla objevena vada v návrhu MD5 , to však neodradilo mnoho lidí, a tak je stále používaná až do roku 2004, kdy byly nalezeny daleko větší chyby, které zapříčinily upouštění od tohoto algoritmu v bezpečnostních aplikacích. Kryptologové z Japonska a posléze i z České republiky jej označili za nebezpečný, neboť objevili, zpětný algoritmus, kterým je možné vysledovat přibližnou množinu zpětných znaků – to pak má za následek menší časovou náročnost pro výpočet zpětného hashe i klasickým PC – pořád se sice jedná o velké množství kombinací – závislé na délce použitého hesla, ale i tak je to zjednodušení pro prolomení takto uloženého hesla.
Největší bezpečnostní riziko však spočívá ve stále rostoucím výkonu výpočetní techniky, a webech, zabývajících se prolamováním MD5 . Podíváte li se na tento odkaz: MD5 crack a vyzkoušíte zadat některé jednodušší heslo například „kolo“ jehož hash je: 8a2bc6f29f421af1f4094296ae17f244 zjistíte, že se jej dozví každý, kdo vidí na hash – tedy ten, kdo na tento hash vidí – webmaster a všichni s přístupem do databáze.
Jak zabezpečit heslo pokud nemohu ovlivnit způsob ukládání hesel MD5 – jsem uživatel:
Je to velmi jednoduché! Stačí mít dostatečně složité heslo, a pravidelně jej měnit – vždy si zkuste ověřit, zda Vaše heslo není v některé z databází crack MD5 systémů na internetu. Neboť ani MD5 crackery, nejsou schopny mít uloženy veškeré otisky všech možných kombinací hesel. Použijete li heslo z minulého článku: Hmv76KgaNSvR1964 jehož hash je: 5b47072a759cab5a0ca0f79095069e33 a crack MD5 systém si s ním neporadí. ( platí ke dni 25.07.2007 ) za pár let již s velkou pravděpodobností i toto heslo bude uloženo v některé databázi MD5 crackeru.
Nebezpečnost spočívá především v tom, když jste členem například nějakého pochybného fóra – webmaster má tyto hashe dostupné v databázi a může je zneužít – například pro přístup k vašemu e-mailu, který jste si na fóru zaregistroval... či dalším službám, které používáte. ( Pouze v případě, že ke všem službám používáte stejné heslo, a hash je v databázi, některého z crack MD5 systému. ) Opět zde je návaznost na můj předcházející článek – kde nedoporučuji používat pro více služeb stejná hesla, proto ještě jednou opakuji – každou službu mějte přístupnou pod jiným heslem – případně alespoň typ služeb a zajistěte aby se ani část hesla neopakovala.
Jak zabezpečit heslo pokud mohu ovlivnit způsob ukládání hesel MD5 – jsem webmaster – vývojář a chci hesla zabezpečit:
Stačí použít jiný nástroj ( hashovací funkci ) – například SHA1 – je novější a ne tak chybový avšak byl již rovněž prolomen – ovšem pouze hrubou silou ( metoda Brute force ), žádný zpětný algoritmus dosud nebyl nikým vyvinut a tak se dá nyní považovat za bezpečnější, než MD5. Použití SHA1 je stejně jednoduché, jako u MD5 od verze PHP 4.3.0 je tato funkce dostupná v PHP a použít ji můžete například takto:
<html>
<head>
<meta http-equiv="Content-Language" content="cs">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>•SHA1• By Ondrej Baar</title>
</head>
<form method="post">
<input name="slovo" class="formular">
<input name="okej" type="submit" class="formular" value=" OK ">
</form>
<?php
if (isset($_POST['okej'])):
$slovo = SHA1($_POST[' slovo ']);
echo $ slovo;
?>
</html>
Druhou možností je přidat ještě nějaký ochranný prvek například přidání specifických znaků do hashe – na určité místa, a poté je stejně připojit i k ověřovanému údaji. Nebo podobným způsobem ukládat pouze část hashe – případně ještě jednou použití funkce MD5 na část řetězce již vygenerovaného touto funkcí – třeba jen polovinu znaků apod.
Závěrem:
Jak jste si již jistě všimli, oblast bezpečnosti a uchovávání hesel, je velmi problematická, ne každý se však touto otázkou zabývá – proto ve svém hlavním zájmu se bezpečností zabývejte alespoň vy co čtete tento článek. Používejte pořádná hesla, pro každou službu úplně jiné, a chraňte tak své údaje před zcizením a následným zneužitím – v dnešní internetové době je to více než žádoucí a nespoléhejte na „webmastery“ amatéry, kteří pro přístupy ke svým dílům, databázím a fórům používají hesla jednodušší, než uživatelé – tímto ohrožení.
Autor: Ondřej Baar