Az md5 veszélyei

Az md5 veszélyei

Az md5 veszélyei

Bár az md5 a felgyorsult számítási műveleteket végző számítógépek miatt nem mondható kimondottan biztonságosnak, azért vannak még trükkök, amivel megvédhetjük az md5 titkosításra épülő adatbázis rekordjainkat.

Az md5 egy 32 karakterből álló, hexadecimális karakterláncot állít elő a titkosítani kívánt karakterláncból. Ez 1632 variációt jelent, ami első olvasásra nem kevés. Ellenben modern számítógépeink már olyan számítási kapacitással bírnak, hogy egy i5-ös processzor nagyjából 196 óra alatt képes megfejteni egy 10 karakteres karakterláncból készült md5 titkosítást. Ha ehhez hozzávesszük, hogy egy hacker egy ilyen visszafejtéshez több gépet is kényszeríthet a számolásra, bizony elég rosszul áll a helyzet.

A visszafejtés annyira felgyorsult, hogy erre a célra már külön adatbázisok léteznek, melyek ezeket a jelszó és hash párokat tartalmazzák, milliárdos tételekben.

Megoldás

Én személy szerint még használom az md5-t, de egy kisebb csavarral. Ha követed ezt a megoldást és már élsz md5 titkosítással a weboldaladon, akkor ez a megoldás hasznos lehet számodra.

Írjunk egy függvényt, ami elkészíti nekünk az md5 hash-ünket, de úgy, hogy tegyen bele egy egyedi kiegészítést, ami magabiztosan azonosítja azért az autentikációhoz szükséges jelszót.

Például

jelszó + egy fix krix-krax karakterlánc + a felhasználónév első, vagy utolsó 2-3 karaktere

PHP


<?php
function get_hash($username, $password, $result)
	{
	$fix_hash = 'gfdT4Sdsv+1';
	$plus_characters = substr($username, 0, 3);

	$result_text = md5($password.$fix_hash.$plus_characters);

	if ($result == 'get')
		{
		return $result_text;
		}
	elseif ($result == 'print')
		{
		echo $result_text;
		}
	}

$md5_hash = get_hash($_POST['username'], $_POST['password'], 'get');
?>

Másik megoldás, hogy elfelejtjük az md5-t

Az md5 titkosítást még 1991-ben fejlesztették ki, hogy a már akkor elavult md4-et felváltsa. 1996-ban már felmerültek biztonsági rések az md5 kapcsán. Ekkor már kezdett világossá válni, hogy az ideálisabb megoldás a Sha-1, vagy a Sha-2/512 titkosítás lenne. Bár intő jelek ellenére máig igen elterjedt az md5 titkosítás.

Pár szó a Sha-1-ről

Ez a titkosítási eljárás 32 karakter helyett már 40 karaktereses hash-t állít elő, melynek visszafejtése komolyabb számolási műveleteket igényel, de a mai gépek már ezzel is képesek felvenni a küzdelmet. Az md5-höz képest megbízhatóbb választás, de még mindig nem az igazi. Már Az Sha-1 titkosításhoz is találni visszafejtett jelszó párokat.

PHP


echo sha1('jelszó');

Pár szó a Sha-2/512-ről

Ez a megoldás már közelebb áll a biztonságos titkosításhoz, ugyanis a 128 karakterből álló hash viszafejtése már kihívás.

PHP


echo hash('sha512', 'jelszó');

Ettől még nem lehetetlen, sőt a későbbiekben feltehetően egyre könnyebb lesz a visszafejtése ennek is. Érdemes tehát kombinálni a megoldásokat. Akár így is:

PHP


echo sha1(hash('sha512', 'jelszó'));

A végeredmény így egy duplán titkosított karakterlánc és a végeredmény mindössze csak 40 karakter. Ezt persze még tovább bővíthetjük az első példában olvasottakkal, vagy amit még a fantáziánk szül és használható valós környezetben is.

Van még más lehetőség is

A PHP 5.5 verziójától kezdve már létezik a "password_hash" nevű függvény is. Alap esetben 60 karakteres hast állít elő, de paraméterezéssel 72 karakteres is előállítható vele.

Az első paraméter maga a kódolandó jelszó, a második a használandó algoritmus. Kettő konstans van erre definiálva, a "PASSWORD_BCRYPT" és a "PASSWORD_DEFAULT". Amint egy erősebb algoritmus is beépítésre kerül, a default annak értékére fog módosulni.

Az opciók közt két értéket adhatunk meg: az egyik a salt, amit ha kihagyunk, random generál egyet; a másik a cost, ami az algoritmus műveletigényére van hatással. Ezt érdemes úgy belőni, hogy egy másodperc körüli idő alatt számoljon egy hasht. Érvényes bármely 4 és 30 közti egész, az alapértelmezett a 10.

Lényegében ezzel a megoldással a fent leírt titkosítási módszert valósíthatjuk meg, egy modernebb, "egyszerűbb" formában.


echo password_hash('jelszó', PASSWORD_DEFAULT);


$options = [
	'cost' => 12,
];
echo password_hash('jelszó', PASSWORD_BCRYPT, $options);


$options = [
	'cost' => 11,
	'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash('jelszó', PASSWORD_BCRYPT, $options);

Ehhez a módszerhez tartozik egy másik hasznos függvény is, a "password_needs_rehash". Ezzel azt tudod eldönteni, szükséges-e a jelszó újrakódolása azért, mert a rendszer közben átállt új algoritmusra, vagy nagyobb költségre. A bejelentkezési folyamat részeként lehet használni, amikor megvan a kódolatlan jelszó is.

Paraméterei annyiban térnek el a password_hash-étől, hogy ez egy már kódolt jelszót vár, nem egy eredetit. Azt adja vissza, gyengébb paraméterekkel (algoritmus, költség) lett-e hash-elve, mint amit kapott.


$password = 'jelszó';
$hash = password_hash($password, PASSWORD_BCRYPT, array(
	'cost' => 7,
	'salt' => "irhatsz_ide_barmilyen_string_et",
)));

if (password_verify($password, $hash)) {
	if (password_needs_rehash($hash, PASSWORD_BCRYPT, array(
		'cost' => 8,
	))) {
		//jelszó frissítése az adatbázisban
	}
	log_user_in();
} else {
	//nem megfelelő jelszó
}

Végezetül egy összefoglaló táblázat a különböző titkosítási algoritmusok eredményeiről és sebesség összehasonlításáról. Nyilván a komolyabb számításokat igénylő eljárások lassabban futnak le.

PHP


<?php
$data = 'hello';

foreach (hash_algos() as $algo)
	{
	$result = hash($algo, $data, false);
	printf("%-12s %3d %s\n", $algo, strlen($result), $result);
	}
?>

AlgoritmusKarakter"Hello" szó eredménye
md232a9046c73e00331af68917d3804f70655
md432866437cb7a794bce2b727acc0362ee27
md5325d41402abc4b2a76b9719d911017c592
sha140aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
sha256642cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e730
sha3849659e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553
sha5121289b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2d
ripemd12832789d569f08ed7055e94b4289a4195012
ripemd16040108f07b8382412612c048d07d13f814118445acd
ripemd25664cc1d2594aece0a064b7aed75a57283d9490fd5705ed3d66bf9a
ripemd32080eb0cf45114c56a8421fbcb33430fa22e0cd607560a88bbe14ce
whirlpool1280a25f55d7308eca6b9567a7ed3bd1b46327f0f1ffdc804dd8bb
tiger128,332a78862336f7ffd2c8a3874f89b1b74f2
tiger160,340a78862336f7ffd2c8a3874f89b1b74f2f27bdbca
tiger192,348a78862336f7ffd2c8a3874f89b1b74f2f27bdbca39660254
tiger128,4321c2a939f230ee5e828f5d0eae5947135
tiger160,4401c2a939f230ee5e828f5d0eae5947135741cd0ae
tiger192,4481c2a939f230ee5e828f5d0eae5947135741cd0aefeeb2adc
snefru647c5f22b1a92d9470efea37ec6ed00b2357a4ce3c41aa6e28e3b
gost64a7eb5d08ddf2363f1ea0317a803fcef81d33863c8b2f9f6d7d1
adler328062c0215
crc3283d653119
crc32b83610a686
haval128,33285c3e4fac0ba4d85519978fdc3d1d9be
haval160,3400e53b29ad41cea507a343cdd8b62106864f6b3fe
haval192,348bfaf81218bbb8ee51b600f5088c4b8601558ff56e2de1c4f
haval224,35692d0e3354be5d525616f217660e0f860b5d472a9cb99d6766be
haval256,36426718e4fb05595cb8703a672a8ae91eea071cac5e7426173d4c
haval128,432fe10754e0b31d69d4ece9c7a46e044e5
haval160,440b9afd44b015f8afce44e4e02d8b908ed857afbd1
haval192,448ae73833a09e84691d0214f360ee5027396f12599e3618118
haval224,456e1ad67dc7a5901496b15dab92c2715de4b120af2baf661ecd92
haval256,4642d39577df3a6a63168826b2a10f07a65a676f5776a0772e0a87
haval128,532d20e920d5be9d9d34855accb501d1987
haval160,540dac5e2024bfea142e53d1422b90c9ee2c8187cc6
haval192,548bbb99b1e989ec3174019b20792fd92dd67175c2ff6ce5965
haval224,556aa6551d75e33a9c5cd4141e9a068b1fc7b6d847f85c3ab16295
haval256,564348298791817d5088a6de6c1b6364756d404a50bd64e645035f

Idő eredmények: (milliszekundumban)

#AlgoritmusSebesség (ms)
1.md45307.912
2.md56890.058
3.crc32b7298.946
4.crc32 7561.922
5.sha18886.098
6.tiger128,311054.992
7.haval192,311132.955
8.haval224,311160.135
9.tiger160,311162.996
10.haval160,311242.151
11.haval256,311327.981
12.tiger192,311630.058
13.haval128,311880.874
14.tiger192,414776.945
15.tiger128,414871.12
16.tiger160,414946.937
17.haval160,415661.954
18.haval192,415717.029
19.haval256,415759.944
20.adler3215796.184
21.haval128,415887.022
22.haval224,416047.954
23.ripemd25616245.126
24.haval160,517818.927
25.haval128,517887.115
26.haval224,518085.002
27.haval192,518135.07
28.haval256,518678.903
29.sha25619020.08
30.ripemd12820671.844
31.ripemd16021853.923
32.ripemd32022425.889
33.sha38445102.119
34.sha51245655.965
35.gost57237.148
36.whirlpool64682.96
37.snefru80352.783
38.md2705397.844

Demo letöltése

Leírásaink azon kezdő és haladó programozóknak nyújtanak segítséget, akik már minimális szinten foglalkoztak weboldalkészítéssel. Ha szeretnél jobban elmélyülni a témában, vagy elsajátítani alapokat, még tovább fejlődni, akkor nézz körbe tanfolyam kínálatunkban, ahol a kezdőtől a profi szintig nyújtunk képzéseket a számodra.

Oszd meg barátaiddal is!

Facebook Twitter Linkedin

Elérhetőségeink

  • Címünk: 1139 Budapest, Frangepán utca 3. (1. emelet)

  • Ügyfélfogadás, beiratkozás: Hétfőtől - péntekig: 09:00-17:00

  • Telefonszámunk: 06 70 604 2060, vagy 06 1 4500 110

  • E-mail címünk:

Közösségünk