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);
}
?>
Algoritmus | Karakter | "Hello" szó eredménye |
---|---|---|
md2 | 32 | a9046c73e00331af68917d3804f70655 |
md4 | 32 | 866437cb7a794bce2b727acc0362ee27 |
md5 | 32 | 5d41402abc4b2a76b9719d911017c592 |
sha1 | 40 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d |
sha256 | 64 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e730 |
sha384 | 96 | 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553 |
sha512 | 128 | 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2d |
ripemd128 | 32 | 789d569f08ed7055e94b4289a4195012 |
ripemd160 | 40 | 108f07b8382412612c048d07d13f814118445acd |
ripemd256 | 64 | cc1d2594aece0a064b7aed75a57283d9490fd5705ed3d66bf9a |
ripemd320 | 80 | eb0cf45114c56a8421fbcb33430fa22e0cd607560a88bbe14ce |
whirlpool | 128 | 0a25f55d7308eca6b9567a7ed3bd1b46327f0f1ffdc804dd8bb |
tiger128,3 | 32 | a78862336f7ffd2c8a3874f89b1b74f2 |
tiger160,3 | 40 | a78862336f7ffd2c8a3874f89b1b74f2f27bdbca |
tiger192,3 | 48 | a78862336f7ffd2c8a3874f89b1b74f2f27bdbca39660254 |
tiger128,4 | 32 | 1c2a939f230ee5e828f5d0eae5947135 |
tiger160,4 | 40 | 1c2a939f230ee5e828f5d0eae5947135741cd0ae |
tiger192,4 | 48 | 1c2a939f230ee5e828f5d0eae5947135741cd0aefeeb2adc |
snefru | 64 | 7c5f22b1a92d9470efea37ec6ed00b2357a4ce3c41aa6e28e3b |
gost | 64 | a7eb5d08ddf2363f1ea0317a803fcef81d33863c8b2f9f6d7d1 |
adler32 | 8 | 062c0215 |
crc32 | 8 | 3d653119 |
crc32b | 8 | 3610a686 |
haval128,3 | 32 | 85c3e4fac0ba4d85519978fdc3d1d9be |
haval160,3 | 40 | 0e53b29ad41cea507a343cdd8b62106864f6b3fe |
haval192,3 | 48 | bfaf81218bbb8ee51b600f5088c4b8601558ff56e2de1c4f |
haval224,3 | 56 | 92d0e3354be5d525616f217660e0f860b5d472a9cb99d6766be |
haval256,3 | 64 | 26718e4fb05595cb8703a672a8ae91eea071cac5e7426173d4c |
haval128,4 | 32 | fe10754e0b31d69d4ece9c7a46e044e5 |
haval160,4 | 40 | b9afd44b015f8afce44e4e02d8b908ed857afbd1 |
haval192,4 | 48 | ae73833a09e84691d0214f360ee5027396f12599e3618118 |
haval224,4 | 56 | e1ad67dc7a5901496b15dab92c2715de4b120af2baf661ecd92 |
haval256,4 | 64 | 2d39577df3a6a63168826b2a10f07a65a676f5776a0772e0a87 |
haval128,5 | 32 | d20e920d5be9d9d34855accb501d1987 |
haval160,5 | 40 | dac5e2024bfea142e53d1422b90c9ee2c8187cc6 |
haval192,5 | 48 | bbb99b1e989ec3174019b20792fd92dd67175c2ff6ce5965 |
haval224,5 | 56 | aa6551d75e33a9c5cd4141e9a068b1fc7b6d847f85c3ab16295 |
haval256,5 | 64 | 348298791817d5088a6de6c1b6364756d404a50bd64e645035f |
Idő eredmények: (milliszekundumban)
# | Algoritmus | Sebesség (ms) |
---|---|---|
1. | md4 | 5307.912 |
2. | md5 | 6890.058 |
3. | crc32b | 7298.946 |
4. | crc32 | 7561.922 |
5. | sha1 | 8886.098 |
6. | tiger128,3 | 11054.992 |
7. | haval192,3 | 11132.955 |
8. | haval224,3 | 11160.135 |
9. | tiger160,3 | 11162.996 |
10. | haval160,3 | 11242.151 |
11. | haval256,3 | 11327.981 |
12. | tiger192,3 | 11630.058 |
13. | haval128,3 | 11880.874 |
14. | tiger192,4 | 14776.945 |
15. | tiger128,4 | 14871.12 |
16. | tiger160,4 | 14946.937 |
17. | haval160,4 | 15661.954 |
18. | haval192,4 | 15717.029 |
19. | haval256,4 | 15759.944 |
20. | adler32 | 15796.184 |
21. | haval128,4 | 15887.022 |
22. | haval224,4 | 16047.954 |
23. | ripemd256 | 16245.126 |
24. | haval160,5 | 17818.927 |
25. | haval128,5 | 17887.115 |
26. | haval224,5 | 18085.002 |
27. | haval192,5 | 18135.07 |
28. | haval256,5 | 18678.903 |
29. | sha256 | 19020.08 |
30. | ripemd128 | 20671.844 |
31. | ripemd160 | 21853.923 |
32. | ripemd320 | 22425.889 |
33. | sha384 | 45102.119 |
34. | sha512 | 45655.965 |
35. | gost | 57237.148 |
36. | whirlpool | 64682.96 |
37. | snefru | 80352.783 |
38. | md2 | 705397.844 |
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.