Kockázatok és kihívások jelszó hash, savepearlharbor
Biztonság mindig is ellentmondásos téma, hogy provokál számos heves vitákat. És hála a rengeteg különböző nézőpontok és az „ideális megoldás”, amelyek megfeleltek bizonyos, és teljesen alkalmatlan másoknak. Úgy vélem, hogy a betörés biztonsági rendszer csak idő kérdése. Mivel a gyors növekedés számítási teljesítmény és növeli a komplexitás a biztonság ma már nem holnap, hogy ilyen kérelmet.
- Egyirányú függvény. hash az eredeti adatokat nem lehet visszaállítani a segítségével egy hatékony algoritmust.
- A változó hosszúságú adatok fix hosszúságú adatok. A bemeneti érték lehet „végtelen” hossz és a kimenet - nincs. Ez azt jelenti, hogy két vagy több bemeneti értékek azonos hash. Minél kisebb a hossza a hash, annál nagyobb a valószínűsége, hogy ütközés.
MD5 algoritmusok SHA-1, és nem nyújtanak kellően nagy megbízhatóság szempontjából a valószínűsége ütközések (lásd. Születésnap paradoxon). Ezért javasoljuk, hogy használja algoritmusok generálnak több hosszú hash (SHA-256, SHA-512. Whirlpool, stb), ami a ütközés valószínűsége elhanyagolható. Ilyen algoritmusok is az úgynevezett „pszeudo-véletlenszám funkció”, azaz a. E. A munkájuk eredményét megkülönböztethetetlenek az eredmények a kiváló minőségű véletlenszám-generátor (igaz véletlenszám-generátor. TRNG).
Az a tény, hogy a segítségével egy hatékony algoritmus nem lehet elvégezni a műveletet, fordított a hash, és vissza az eredeti adatokat, nem jelenti azt, hogy nem lehet feltörni. Ha a keresés is megtalálható egy adatbázis-kivonatok közös szavak és rövid kifejezések. Ezen túlmenően, az egyszerű jelszavakat lehet gyorsan és könnyen reped brute force brute force szótárban.
Itt egy kis bemutató, hogyan sqlmap eszköz bevezetése révén SQL-kód hack jelszavak brute force hash által generált MD5 algoritmus.
A támadók tehetünk még könnyebb - naguglit egyedi hash online adatbázisban:
Ahhoz, hogy akadályozná támadás ismertetett fajtájú használják úgynevezett só. Ez a szabvány jelent, de olyan körülmények között, modern számítási teljesítmény már nem elég, főleg, ha sók hossza kicsi.
Általában, a függvény használatával só az alábbi képlettel ábrázolható:
f (jelszó, só) = hash (jelszó + só)
Nehézségekért brute force támadások só legyen legalább 64 karakter. De a probléma az, hogy annak érdekében, hogy további felhasználók hitelesítésére sót kell az adatbázisban tárolt szöveges formában.
ha (a hash ([beírt jelszó] + [G]) == [hash]), ha a felhasználó hitelesítését
Mivel a különleges só minden felhasználó számára, meg tudjuk oldani a problémát az ütközések egyszerű hash-eket. Most minden ellenőrző összeg más lesz. Szintén nem fog működni közelít gugleniya hash és a nyers erő. De ha a támadó végrehajtása révén az SQL-kódot fog férni só, vagy egy adatbázis, képes lesz sikeresen támadja vagy brute force nyers erő, szótár, különösen, ha a felhasználó választhat a közös jelszavak (a la 123456).
Mindazonáltal, megtörve Bármelyik jelszó már nem automatikusan kiszámítja a felhasználók, akik ugyanazt a jelszót -, mert már az összes hash különbözőek.
A generál megfelelő só szükségünk van egy jó véletlenszám-generátor. Azonnal felejtsd el a rand () függvény.
Amikor a számítógép szeretné véletlen számot, akkor általában tart több forrásból származó adatok (például a környezeti változók: idő, dátum, több rögzített / olvasni bájt, stb ...) És akkor generálja őket számítás megszerzésére „véletlen” adatokat. Ezért ezek az adatok az úgynevezett pszeudo. Tehát, ha valahogy újra a kezdeti feltételek idején végrehajtás a pszeudo-random funkciót, akkor képesek leszünk létrehozni ugyanazt a számot.
Ha a pszeudo-véletlenszám generátor és végrehajtani rendesen, az adatok által generált képes felismerni a mintákat, és azokat, hogy létrehozzunk egy megjósolt eredményt. Megnézzük ezt a képet, amely eredményeként a PHP-függvény rand ():
És most hasonlítsuk össze a generált adatok teljes véletlenszám-generátor:
Sajnos sem a rand (), audio mt_rand () nem tekinthető megfelelő eszközök magas szintű biztonságot.
Ha kell, hogy véletlen adatok segítségével a függvény openssl_random_pseudo_bytes (). amely elérhető verzió óta 5.3.0. Ő is van crypto_strong zászló, ami megmondja a megfelelő szintű biztonság.
Akkor végre egy jelszó erőssége, ez lehetővé teszi, hogy tovább bonyolítaná brute force támadások. A nyújtás iteratív vagy rekurzív algoritmus, amely ismételten kiszámítja a hash magát, több tízezer (vagy még több).
A iterációk száma olyannak kell lennie, hogy a teljes számítási időt vett legalább egy második. A hosszabb kapott hash, a támadó több időt tölteni a hackelés.
Jelszavak feltörésére egy kificamodott szükség:
- tudja a pontos iterációk száma, mint bármely eltérést fog egy másik hash;
- várjon legalább másodpercet kísérlet.
Ez teszi a támadás nagyon valószínűtlen ... de nem lehetetlen. Ahhoz, hogy az másodperces késleltetést, a támadónak kell használni egy erősebb számítógépet, mint az, amely alatt a algoritmus van állítva. Következésképpen, megtörve a folyamathoz szükség lehet további költségeket.
Normál algoritmusok használhatók, például PBDKDF2, ami egy kulcs származtatás függvény a jelszót nyújtás.
Vannak is több időt vesz igénybe, és a memória algoritmusok, mint bcrypt (fogunk beszélni később), vagy scrypt:
- $ Költség - a munkaerő-intenzitása faktor;
- $ Salt - véletlenszerű karaktersorozat. Lehetőség van generálni, például keresztül secure_rand () függvény a fent leírt.
munkaerő intenzitási tényező attól függ a gép van, amelyre a tördeljük. Kezdheted az értéke 09, és fokozatosan növelni, amíg el nem éri a művelet időtartama egy másodperc. Kezdve 5.5 verzió, akkor a függvény password_hash (), megbeszéljük ezt tovább.
Abban a pillanatban, nem a PHP támogatja scrypt algoritmust, de lehetséges, hogy kihasználják a végrehajtása Domblack.
Sokan vannak zavarodva a „hash” és a „titkosítás”. Mint már említettük, a hash - az eredmény egy pszeudo-véletlenszám funkció, míg a titkosítás - végrehajtása egy pszeudo-véletlen átalakulás. A bemeneti adatok oszlik darabokat és feldolgozásra, hogy az eredmény nem különböztethető meg a munka eredményeként teljesen véletlenszám-generátor. Azonban ebben az esetben lehetséges, hogy végezzen az inverz transzformációt és visszaállíthatja az eredeti adatokat. Hajtunk végre a titkosítási kulcs, amely nélkül nem lehet elvégezni a fordított átalakítás.
Van még egy fontos különbség a titkosítást a tördelő: a méret a kimeneti üzenet tér nem korlátozott, és méretétől függ a bemenő adatok aránya 1: 1. Ezért nincs ütközés.
Néhány évvel ezelőtt, az Adobe erős kiszivárgott felhasználói adatbázist, mert a helytelenül végrehajtott titkosítást. Nézzük meg, mit történt.
Tegyük fel, hogy a táblázat tartalmazza a következő adatokat szöveges formában:
Valaki az Adobe úgy döntött, hogy titkosítja a jelszavakat, de készült két nagy hibát:
- Régebben az azonos fogyasztói titkos;
- bal oldali mezőben passwordHint titkosítva.
Tegyük fel, hogy a táblázat után kezdődött a titkosítás néz ki:
Nem tudjuk, mi használtuk Fogyasztói titok. De ha elemezzük az adatokat, kiderül, hogy a 2-es és 7 használja ugyanazt a jelszót, valamint a 3 és 6.
Itt az ideje, hogy forduljon a prompt jelszót. 6. sor a «Egyike vagyok!», Ami elég uninformative. De hála a 3. sorban, akkor feltételezhetjük, hogy a jelszó - királynő. 2-es és 7 egyedül nem teszik lehetővé, hogy kiszámítja a jelszót, de ha felveszi őket össze, akkor azt feltételezzük, hogy ez a halloween.
Annak érdekében, csökkentve annak kockázatát, adatvesztés a legjobb, ha egy másik hash módszerek. És ha meg kell, hogy titkosítja a jelszavakat, majd figyelni, hogy az egyéni titkosítás:
Tegyük fel, hogy több ezer felhasználó és szeretnénk titkosítani az összes jelszót. Mint a fentiekből kiderül, hogy jobb elkerülni a használatát egy kripto. De vajon mi is nem minden felhasználó egyedi kulcsot, mert a kulcs tárolás maga lesz a probléma. Ebben az esetben kell alkalmazni kellően közös valamennyi fogyasztói titkos, de hogy a „kiigazítás”, hogy egyedi legyen minden felhasználó számára. A kombináció a kulcs és a „Beállítások”, és lesz egy egyedi kulcs minden felhasználó számára.
A legegyszerűbb változat a „hangolás” - az úgynevezett elsődleges kulcs. egyedi minden rekordot a táblázatban. Nem ajánlott használni az életben, itt csak akkor jelenik meg, mint például:
F (kulcs, PrimaryKey) = gombot + PrimaryKey
Itt a kulcs, és az elsődleges kulcsot egyszerűen konkatenálva. De a biztonság kell alkalmazni rájuk algoritmus vagy a kulcs származtatás függvény (kulcs származtatás függvény). Az is lehetséges, hogy egy egyszeri kulcs minden rekordot az elsődleges kulcs helyett (só analóg).
Ha alkalmazzuk az asztalunkhoz konfigurálható titkosítást, akkor így fog kinézni:
Persze, meg kell valami mást csinálni a tippeket jelszavakat, de még mindig van, hogy legalább valami megfelelő.
Vegye figyelembe, hogy a titkosítás - nem ideális megoldás tárolására jelszavakat. A kapcsolat a végrehajtása a kód fenyegetések legjobb elkerülni ezt a módszert a védelmet. Ahhoz, hogy tárolja a jelszavakat biztonságosan használata bcrypt algoritmus. De nem szabad elfelejteni, hogy még a legjobb és bevált megoldások réseket.
Ma a legjobb módja az, hogy a jelszó hash bcrypt. De sok fejlesztő még mindig inkább a régi és gyengébb algoritmusok, mint például az MD5 és SHA-1. És néhány tördelő nem is használ sót. A PHP 5.5 egy új API hash, amely nemcsak segíti elő a bcrypt, hanem jelentősen könnyebb dolgozni vele. Nézzük az alapokat használja ezt az új API-t.
Íme négy egyszerű funkciókat használnak:
- password_hash () - jelszó hash;
- password_verify () - összehasonlítva a jelszót a hash;
- password_needs_rehash () - pereheshirovanie jelszó;
- password_get_info () - visszatér a neve a hash algoritmus, és az alkalmazott során egy hash lehetőségeket.
Annak ellenére, hogy a magas szintű biztonságot nyújt a függvény crypt (), sokan úgy vélik, túl bonyolult, ezért a programozók gyakran hibáznak. Ehelyett néhány fejlesztők létrehozásához használt hash kombinációja gyenge és gyenge algoritmusok sók:
password_hash () funkció segíti a fejlesztő életét, és javítja a biztonságot a kódot. Jelszó hash értékének elég takarmány funkcióját, és a készülék visszatér a hash, hogy lehet helyezni az adatbázisban:
És mégis! Az első érv - a kód, mint egy húr, a második argumentum adja előállítására szolgáló algoritmus hash. Az alapértelmezett bcrypt, de akkor adjunk hozzá egy erősebb algoritmus, amely létrehoz egy sor hossza nagyobb, ha szükséges. Ha a projekt használ PASSWORD_DEFAULT, majd győződjön meg arról, hogy az oszlop szélessége tárolására hash legalább 60 karakter. Jobb csak beállítani a 255 karaktert. A második érv lehet használni PASSWORD_BCRYPT. Ebben az esetben a hash mindig 60 karakter hosszú lehet.
Felhívjuk figyelmét, hogy nem kell az értéket a só, vagy a paraméter értékét. Az új API mindent meg fog tenni az Ön számára. Mivel a só része a hash, akkor nem kell tárolja külön. Ha még mindig kell kérnie só érték (vagy érték), hogy meg lehet csinálni a segítségével a harmadik érv:
Mindez lehetővé teszi, hogy a legújabb biztonsági funkciókat. Ha a jövőben a PHP lesz erősebb algoritmus, a kód automatikusan használni fogja.
Most nézzük meg egy összehasonlító függvényt a jelszó hash. Először be a felhasználó, és a második vesszük az adatbázisból. A jelszó és a hash használunk két érv password_verify () függvényt. Ha a hash megegyezik a jelszót, akkor a függvény igaz.
Ne feledje, hogy a só része a hash, így az már nem itt külön-külön.
Ha azt szeretnénk, hogy növelje a biztonsági szintet hozzáadásával erősebb sója vagy a növekvő költségek paramétereket, vagy módosítsa az alapértelmezett algoritmus, akkor valószínűleg szeretné pereheshirovat a jelszavakat. Ez a funkció segít, hogy ellenőrizze az egyes hash milyen algoritmus és paramétereket alkalmaztuk annak létrehozását:
Ne felejtsük el, hogy szüksége lesz, hogy ezt egy olyan időszakban, amikor a felhasználó megpróbál belépni, mivel ez az egyetlen alkalom, akkor hozzáférhet a jelszó egyszerű szövegként.
Ez a függvény egy hash és visszaadja egy asszociatív tömböt három elemből áll:
- algo - állandó, amely lehetővé teszi, hogy azonosítsa az algoritmus;
- algoName - a név a használt algoritmus;
- beállítások - beállítások különböző alkalmazott értékek a hasítás.
Mint látható, a munka az új API nem egy példa a jobb, mint ügyetlen függvény crypt (). Ha korábbi verzióinak használata PHP, azt ajánlom, hogy figyeljen password_compact könyvtárban. Utánozza az API és automatikusan kikapcsol, ha frissít 5.5-ös verzióra.
Sajnos, a mai napig nincs tökéletes megoldás az adatok védelme. Ezen kívül mindig fennáll a veszélye, hogy elszakadna a biztonsági rendszer. Azonban a harc a lövedék és a páncél nem áll meg. Például a arzenáljának jogorvoslati nemrég hozzáadott úgynevezett szivacs funkciókat.