PHP-ban az sha1_file () függvény által készített szám visszafejthető?
PHP-ban az sha1_file() függvény által készített szám visszafejthető?
Ha igen milyen úton? Ha nem miért nem?
Persze, hogy nem. Ez csak egy hash.
Csak gondolj bele, milyen hosszú egy fájl tartalma és milyen hosszú a hash, amit kapsz. :D
A hash egy egyirányú függvény,(A függvény matematikai definícióját most nem írom le, feltételezem, tudod, hogy mi az) ,azaz nem invertálható. Tehát a kimenetből nem tudod megmondani, hogy mi volt a bemenete.
Néhány egyszerű ilyen függvény : x^2(mert ugye a 4-ről nem tudod megmondani, hogy a -2-nek vagy 2-nek a négyzetre emeléséből kaptuk-e), vagy az abszolútérték.
Ugyanígy működik a hash is, csak persze az adott kimenethez tartozó, szóba jöhető bemenetek száma sokkal nagyobb: beadsz egy értéket, ő visszaad egy értéket, de a visszaadott értékből nem tudod megmondani, hogy milyen bemenetre adta azt az értéket.
Arra jó például, hogy adat-vagy programállományok integritását, sértetlenségét ellenőrizheted vele: nagyon nehéz pl. egy .exe file-t úgy megmódosítani(pl. valami kártékony kódot belerakni), hogy a hash kódja ne változzon meg, és működőképes is maradjon.
Másik gyakori alkalmazási módja a jelszavak tárolása.
Az adatbázisban nem magát a jelszót, hanem a jelszóhoz generált hash kódot tárolják le, és amikor valaki bejelentkezik, akkor a megadott jelszavából ugyancsak generálnak egy hash-t, és összehasonlítják a letárolt hash-el.
Így, ha valaki hozzá is fér az adatbázishoz, és bele tud nézni a táblákba, akkor sem fogja tudni a jelszavakat megszerezni.
Talán a négyzetre emelésnél jobb példa az összeadás. Ha van egy számsorod (pl. 1,8,5,2), akkor annak ugye ki tudod számolni az összegét (16). Viszont a 16-ból soha nem fogod visszafejteni az eredeti számsort. Az sha1 algoritmus annyiban különbözik ettől, hogy amíg az összeggel generált hash-hez egyszerű olyan számsort gyártani, aminek az összege 16, addig az sha1 esetén ez igen nehéz és hosszú feladat.
Többek között ilyenre használják:
- A jelszó helyett annak az sha1 kódolt változatát mentik le. Mikor valaki megpróbál belépni, akkor az általa megadott jelszónak is veszik az sha1 hash-ét és ezt hasonlítják össze az adatbázisban találhatóval. Ha a jelszó megegyezik akkor ugye ennek az sha1 kódja is megegyezik. Ha valaki ellopná az adatbázist, akkor nem igazán tudná visszafejteni a jelszavakat.
- Letöltésnél is jól jöhet. Ha a fájl hibátlanul lett letöltve, akkor az sha1 kódja megegyezik a mellékelt kóddal. Ha nem egyezik, akkor a fájl letöltése hibás volt.
Ha visszafejthető függvényt keresel, akkor pl. érdemes a mcrypt_encrypt és mcrypt_decrypt függvényeket használni. Bár azt gondolom, hogy ritkán van szükség ilyenre. Ha leírod, hogy egészen pontosan mi a célod ezzel a kódolással, akkor lehet hogy tudok adni más megoldást.
Először vegyük sorra, mit várunk el egy ideális hash algoritmustól:
- Egyetlen bitnyi információkülönbség a lehető legnagyobb mértékben változtassa meg a hash-t.
- A hash birtokában ne lehessen megmondani, hogy az eredeti adatsor milyen jellemzőkkel rendelkezett.
- Minél nehezebb legyen két olyan eltérő adatsort találni, aminek közös a hash kódja.
- Lehetőleg a rövid adatsorokhoz tartozó hash kódokhoz legyenek minél hosszabbak azok az adatsorok, amelyek ugyanazt a hasht eredményezik. (Magyarán a kisebb adatsorok esetén ne legyen két adatsornak azonos a hash kódja.)
Mindegyik hash generáló algoritmusnak lehetnek hibái, hiányosságai. Pl. az md5 esetén ismernek olyan hibákat, ami alapján bizonyos hash-ek esetén meg lehet mondani, hogy milyen jellegű adatsorok lehetnek esélyesebbek, és melyek kevésbé. Márpedig ez nem előnyös, hiszen kevesebb próbálkozás kell egy adott hash-hez megfelelő adatsort találni. Ma már nem is nagyon ajánlják a használatát, de kompatibilitási okok miatt benne kell, hogy legyen a PHP-ben.
A sebesség is érdekes lehet. Vannak számításigényesebb eljárások, és vannak gyorsabbak. Mindkettő lehet szempont. Ha sok adat integritását kell hash alapján ellenőrizni, akkor jól jöhet a gyorsaság. Viszont ha pl. jelszó ellenőrzésre használjuk, akkor kimondottan előnyös, ha az eljárás számításigényes, hiszen így adott idő alatt kevesebb jelszót lehet kipróbálni. Kicsit olyan ez, mint a képformátumoknál (gif, jpeg, png), mindegyik másra jó, ami egy célra előnyös, az a másik esetben lehet hátrány.
Másrészről egyszerűen többen foglalkoztak hash algoritmus készítésével. Több ilyen algoritmus készült, ezek egy része elterjedté vált, egy bizonyos környezetben akár szabvánnyá is. Egyszerűen arról van szó, hogy több létezik. Olyan ez, mint a videóátvitelre használt kábelek esetén. Van scart, RCA, S-Video, stb… Nem biztos, hogy jobb egyik a másiknál, egyszerűen csak más készítette másmilyenre és nem állapodott meg a szakma egy bizonyos megvalósítás szabványosításában.
(A hash kód hossza arányban áll a visszafejthetőségével. Ha egy hash kód mondjuk 8 bites, akkor 256 próbálkozás után biztosan találunk két olyan adatsort, amelynek a hash kódja ugyanaz. Egy adott hash kódhoz is kb. ilyen nagyságrendű próbálkozás árán tudunk adatsort generálni. Egy 128 bites hash esetén már 2^128 különböző hash-ről beszélünk. Egyszer elmélkedtünk itt arról, hogy mekkora is ez a szám. Lásd itt:
http://www.gyakorikerdesek.hu/szamitastechnika__programozas_..
)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!