* Hash алгоритми за криптиране

Публикувано на 21 ноември 2008 в раздел ПТСК.

След като обяснихме ползата от криптиране на базата данни остана въпроса как е най-подходящо да го направим. Стандартно и най-често използвани са hash алгоритмите. Това са функции, които трансформират подаден текст само в едната посока (тоест веднъж криптиран не съществува възможност за съставяне на обратен алгоритъм). Най-важната черта за един hash алгоритъм е резултатът от него да изглежда колкото се може повече произволен (тоест да не можем да правим заключение за евентуалният вид на оригиналният текст по вида на криптирания вариант). С други думи двата символни низа „общината отново вдигна данък смет“ и „общината отново вдигна данъка смет“ би трябвало да дадат визуално напълно различни резултати след криптиране.

В интернет приложенията широко се използват два много популярни hash алгоритъма – sha1 и md5. Следният пример демонстрира тяхното действие:

<html>
<head>
</head>
<body>
<?php
	$originalText = "Obshtinata otnovo vdigna danak smet";
	echo "Original text: ".$originalText;
	echo "<br>SHA1 (160bit) hash: ";
	echo sha1($originalText);
	echo "<br>MD5 (128bit) hash: ";
	echo md5($originalText);

	$originalText = "Obshtinata otnovo vdigna danaka smet";
	echo "<br><br>Original text: ".$originalText;
	echo "<br>SHA1 (160bit) hash: ";
	echo sha1($originalText);
	echo "<br>MD5 (128bit) hash: ";
	echo md5($originalText);
?>
</body>
</html>

Резултатът след изпълнението на този скрипт ще бъде следния:

	Original text: Obshtinata otnovo vdigna danak smet
	SHA1 (160bit) hash: 56b5f0e231d56ab1b659e37418b56042283e12be
	MD5 (128bit) hash: 16e2021a032e1937935e3118a9efbdf0

	Original text: Obshtinata otnovo vdigna danaka smet
	SHA1 (160bit) hash: a96ddc612e80db0274b40a9b6da8a30396133364
	MD5 (128bit) hash: 077d6a15d24fa1647b5d6b4f9bff1844

Виждате, че тези два алгоритъма се справят достатъчно добре със задачата. Единственият начин да „разкодирате“ криптирана парола е използването на т.нар. rainbow таблици или използването на brute force атака.

Rainbow таблиците са бази от данни с изключително голямо количество двойки от тип „оригинален символен низ“ – „криптиран символен низ“. Когато пуснете заявка в тази база данни с криптирания низ ако се намери съвпадение ще получите оригиналния текст. Трябва да знаете, че съществуват изключително големи rainbow таблици. Например в gdataonline.com има над 1,133,759,239 записа на MD5 хешове на всякакви комбинации от думи и цифри на различни езици. Затова спазването на строги правила относно сложността на паролите е от голямо значение.

Brute Force атаките влизат в употреба тогава, когато rainbow таблиците не дават резултат. На практика принципа е почти същия – обикновено се избират някакви ключови думи и започват да се пробват всякакъв вид комбинации между тях с числа и други символи. Търсенето по този начин е много пъти по-бавно от използването на таблици, защото всяка дума трябва да се криптира преди да бъде сверена. Въпреки това става дума за хиляди хешове в секунда.

Вървейки по този принцип става ясно едно – рано или късно в момента съществуващите алгоритми за криптиране ще станат безполезни. С напредването на времето ще бъдат въвеждане все повече и повече комбинации в rainbow таблици, тоест нашите пароли трябва да стават все по-дълги и по-сложни. В същото време ще е изключително трудно за нашето приложение да смени алгоритъма за криптиране на съществуващи потребители. Поради тази причина е нужно да помислим за някакви допълнителни методи, които да спестят бъдещи главоболия:

1. Многократно криптиране: това е често използвана практика – например двоен MD5. По този начин се криптираме повторно създадения hash и по този начин обезсмисляме повечето rainbow таблици. Слабата страна на този метод, е че времето отделено за обработка на данните нараства с толкова пъти, колкото криптираме символните низове.

2. Комбинирано криптиране: това е например когато криптираме текст с MD5 и след това криптираме създадения hash повторно с SHA1. Комбинацията от алгоритми е всевъзможна. Ефектът е почти същият както при предишната точка.

3. Използване на „salt“: много силна техника, която помага изключително много срещу rainbow таблици. Вместо да записваме директно криптираният код на паролата, ние долепяме произволен (и задължително сложен) символен низ към нея, след което я криптираме и записваме. Така складираната парола в базата данни ще бъде достатъчно сложна, за да устои на каквато и да е rainbow таблица.

Първите два метода не решават напълно проблема с brute force атаките. Ако атакуващият просто регистрира собствен акаунт в системата, то той лесно ще може да разбере каква комбинация от алгоритми сте използвали. Може обаче да се приеме, че комбинация между третия метод с някой от първите два ще даде значително добър резултат и може да се каже, че данните са защитени.

Използването на по-нов или нестандартен алгоритъм за криптиране допълнително подобрява нещата. Вече съществуват подобрени варианти на SHA – SHA-224, SHA-256, SHA-384, and SHA-512 (познати също под общо име като SHA2). Стандартът SHA3 е в процес на разработка. Съществуват и редица не толкова популярни алгоритми като Ripemd, Whirlpool, Haval, Tiger, и т.н.

В никакъв случай не използвайте стари hash алгоритми, като например DES (56 битов).



9 коментара за “Hash алгоритми за криптиране”

 
  1. Bakudan:

    Имам един въпрос – сайт предлага се автоматично генериране на парола, която е от случайни символи. Добре, криптира се, и това добре. Само, че обикновенно това, което се генерира не е с различна дължина за различните потребители. И тук идва момента, който ми се струва интересен – добавянето на salt, няма да увеличи сигурността особенно. Познати смятат, че подобен тип абсолютно случайни пароли вършат работа. На мен ми се струва че този метод е ненадеждан.
    Примерно написвам си програмка за генериране на случайни низове, задавам параметри за варираща дължина, за използвани знаци, за криптиране SHA1/MD5, и си правя една хубава табличка. Теоретично така не се ли увеличава шанса за пробив? А и при такава ситуация, моята намаса епочти нулева.

     
  2. Филип Петров:

    Здравей,

    Стига алгоритъмът за генериране на случайни низове да е добър (тоест нормално разпределени резултати без много повторения на символи), то не е особен проблем. Естествено много добре си забелязал слабостта със статична дължина на низа – ясно е, че това улеснява евентуален анализ на изтеглена база от закодирани пароли.

    Колкото до salt – прочети следната статия:

    Добавяне на Salt към паролите

    Според мен вторият вид salt не е безполезен, дори при споменатите случайни пароли.

     
  3. борислава:

    nqkoi moje l ida mi pomogne imam profil v sms.mtel.net i sam si zabravila parolata sled tova pisha si emaila za da moje da mi q prati i se okazva 4e pri registriraneto sam napisala vmesto dolna 4erta tire i sega vemoga da si vlqza v profila ami trqbvat telefonite ot tam

     
  4. Филип Петров:

    Борислава:

    1. Можеш ли да пишеш на кирилица?;

    2. Регистрирай си e-mail с тире ако е свободен;

    3. Ако 2. не става – пиши на поддръжката на Мтел.

    Въпросът ти няма нищо общо с темата на статията!

     
  5. nadq yordanova:

    Molq decriptiraite mi tova:
    0deaf7cd13a645abdd75307e9c4e9007
    ako nqkoi moje da pomogne ste buda blagodarna!
    kitkat1@abv.bg

     
  6. Филип Петров:

    Ммм… не :)

     
  7. nadq yordanova:

    blagodarq vse pak ako moje da mi dadete savet kak da otkriq re6enieto …..molq

     
  8. Гаджев:

    Ако вместо да се, използват rainbow таблици за да се открие паролата, директно се изпращат низове наподобяващи низовете от MD5 или SHA генерирани посредством brute force, ще се заобиколи смисъла от криптирането. Тоест, имаме краен брой възможности за изходни комбинации от криптиращите алгоритми, които могат да бъдат тествани и без да се установи паролата, все пак да се „пробие“ защитата. Може би по-дълги комбинации и проверка на броя некоректни опита за достъп, би бил добро допълнение на тези алгоритми в практиката.

     
  9. Филип Петров:

    Ако те разбрах вярно, то отговорът ми е НЕ, това няма да заобиколи нищо. Каквито и низове да се изпращат те минават през hash алгоритъма и той не може да се заобиколи. В частност дори да се изпрати като парола hash код, то се получава двойно хеширане. Атака чрез изпращане на hash кодове вместо пароли е силно безсмислена.

     

RSS за коментарите

Пусни коментар