Jelszó birtoklása a Java-ban
Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:
>> ELLENŐRIZZE A FOLYAMATOT1. Áttekintés
Ebben az oktatóanyagban megvitatjuk a jelszó kivonatolásának fontosságát.
Gyorsan megvizsgáljuk, mi ez, miért fontos, és néhány biztonságos és nem biztonságos módszert, amellyel ezt Java-ban lehet végrehajtani.
2. Mi a hash?
A hashelés egy karakterlánc, vagy hash, egy adottból üzenet a néven ismert matematikai függvény használatával kriptográfiai hash funkció.
Noha számos hash-funkció létezik, a jelszavak kivágására szabottaknak négy fő tulajdonsággal kell rendelkezniük a biztonság érdekében:
- Kellene lennie meghatározó: ugyanazt az üzenetet kell feldolgozni ugyanazzal a hash függvénnyel mindig ugyanazt előállítani hash
- Ez nem megfordítható: nem praktikus a üzenet annak hash
- Magas entrópia: egy kis változás a üzenet nagyon eltérő eredményt kell előállítania hash
- És ellenáll ütközések: két különböző üzenetek nem kellene ugyanazt produkálnia hash
A mind a négy tulajdonsággal rendelkező hash-függvény erőteljes jelölt-rejtvény-jelölt, mivel együttesen drámai módon megnövelik a jelszó hash-ból történő visszafejtésének nehézségeit.
Emellett azonban a jelszó kivonási funkcióinak lassúaknak kell lenniük. Egy gyors algoritmus segítene nyers erő támadások, amelyek során egy hacker megpróbálja kitalálni a jelszót, másodpercenként milliárdnyi (vagy billió) potenciális jelszó összevonásával és összehasonlításával.
Néhány nagyszerű hash függvény, amely megfelel ezeknek a kritériumoknakPBKDF2, BCrypt, és SCrypt. De először vessünk egy pillantást néhány régebbi algoritmusra, és miért nem ajánljuk őket többé
3. Nem ajánlott: MD5
Első hash funkciónk az MD5 üzenet-lebontó algoritmus, amelyet 1992-ben fejlesztettek ki.
Java Üzenet feldolgozása megkönnyíti ennek kiszámítását, és más körülmények között is hasznos lehet.
Az elmúlt néhány évben azonban Az MD5-ről kiderült, hogy nem sikerült a negyedik jelszó-kivonási tulajdonság abban, hogy számítási szempontból könnyűvé vált ütközések generálása. Ráadásul az MD5 gyors algoritmus, ezért haszontalan a durva erővel járó támadásokkal szemben.
Ezek miatt az MD5 nem ajánlott.
4. Nem ajánlott: SHA-512
Ezután megnézzük az SHA-512-et, amely a Secure Hash Algorithm család része, egy család, amely még 1993-ban kezdődött az SHA-0-val.
4.1. Miért az SHA-512?
Ahogy növekszik a számítógépek teljesítménye, és ahogy új sebezhetőségeket találunk, a kutatók az SHA új verzióit kapják. Az újabb verziók fokozatosan hosszabbak, vagy néha a kutatók az alapul szolgáló algoritmus új verzióját teszik közzé.
Az SHA-512 jelenti a leghosszabb kulcsot az algoritmus harmadik generációjában.
Míg mostantól vannak biztonságosabb verziói az SHA-nakAz SHA-512 a legerősebb, amely Java-ban van megvalósítva.
4.2. Megvalósítás Java-ban
Most nézzük meg az SHA-512 hash algoritmus Java-ban történő megvalósítását.
Először is meg kell értenünk a fogalmát só. Egyszerűen fogalmazva, ez egy véletlenszerű szekvencia, amely minden új hash-hoz generálódik.
Ennek a véletlenszerűségnek a bevezetésével növeljük a kivonatokat entrópia, és megvédjük adatbázisunkat az előre összeállított hash-listáktól, amelyek néven: szivárványos asztalok.
Új hash funkciónk ezután nagyjából:
só <- generál-só; hash <- salt + ':' + sha512 (só + jelszó)
4.3. Só előállítása
A só bevezetéséhez a SecureRandom osztály tól java.biztonság:
SecureRandom random = új SecureRandom (); bájt [] só = új bájt [16]; random.nextBytes (só);
Akkor használjuk a Üzenet feldolgozása osztály a SHA-512 hash funkció sóinkkal:
MessageDigest md = MessageDigest.getInstance ("SHA-512"); md.frissítés (só);
És ehhez hozzáadva most már használhatjuk a megemészteni módszer a kivonatolt jelszó előállításához:
byte [] hashedPassword = md.digest (passwordToHash.getBytes (StandardCharsets.UTF_8));
4.4. Miért nem ajánlott?
Ha sóval alkalmazzák, az SHA-512 még mindig megfelelő megoldás, de vannak erősebb és lassabb lehetőségek.
Ezenkívül a fennmaradó opcióknak fontos jellemzőjük van: konfigurálható erősség.
5. PBKDF2, BCrypt és SCrypt
A PBKDF2, a BCrypt és az SCrypt három ajánlott algoritmus.
5.1. Miért ajánlják ezeket?
Ezek mindegyike lassú, és mindegyiknek ragyogó tulajdonsága, hogy konfigurálható szilárdsággal rendelkezik.
Ez azt jelenti, hogy amint a számítógépek erősödnek, a bemenetek megváltoztatásával lelassíthatjuk az algoritmust.
5.2. A PBKDF2 implementálása Java-ban
Most, a sók a jelszó-összekeverés alapelve, és ezért szükségünk van a PBKDF2-re is:
SecureRandom random = új SecureRandom (); bájt [] só = új bájt [16]; random.nextBytes (só);
Ezután létrehozunk egy PBEKeySpec és a SecretKeyFactory amelyet a PBKDF2WithHmacSHA1 algoritmus:
KeySpec spec = new PBEKeySpec (password.toCharArray (), só, 65536, 128); SecretKeyFactory gyár = SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA1");
A harmadik paraméter (65536) a szilárdsági paraméter. Jelzi, hogy hány algoritmus fut ezen algoritmus, növelve a kivonat előállításához szükséges időt.
Végül használhatjuk a mi SecretKeyFactory a kivonat előállításához:
bájt [] hash = gyár.generateSecret (spec) .getEncoded ();
5.3. A BCrypt és a SCrypt megvalósítása Java-ban
Szóval, kiderült A BCrypt és a SCrypt támogatás még nem érkezik meg a Java-val, bár néhány Java könyvtár támogatja őket.
Az egyik ilyen könyvtár a Spring Security.
6. A jelszó elosztása a tavaszi biztonsággal
Bár a Java natív módon támogatja a PBKDF2 és az SHA hash algoritmusokat, nem támogatja a BCrypt és a SCrypt algoritmusokat.
Szerencsénkre a Spring Security szállítja az ajánlott algoritmusok támogatását a PasswordEncoder felület:
- MessageDigestPasswordEncoder MD5-t és SHA-512-et ad nekünk
- Pbkdf2PasswordEncoder PBKDF2-t ad nekünk
- BCryptPasswordEncoder ad nekünk BCrypt, és
- SCryptPasswordEncoder SCryptet ad nekünk
A PBKDF2, a BCrypt és az SCrypt jelszó kódolói mind támogatják a jelszó kivonatának kívánt erősségét.
Ezeket a kódolókat közvetlenül is használhatjuk, anélkül, hogy rendelkeznénk Spring Security alapú alkalmazással. Vagy ha a Spring Security programmal védjük webhelyünket, akkor konfigurálhatjuk a kívánt jelszó kódolót a DSL-en keresztül vagy függőségi injekcióval.
És a fenti példákkal ellentétben ezek a titkosítási algoritmusok előállítják számunkra a sót belsőleg. Az algoritmus a sót a kimeneti kivonatban tárolja, hogy később felhasználható legyen a jelszó érvényesítéséhez.
7. Következtetés
Tehát mélyen belemerültünk a jelszó-összekeverésbe; a koncepció és felhasználásának feltárása.
Megvizsgáltunk néhány történelmi kivonatoló funkciót, valamint néhányat, amelyeket jelenleg megvalósítunk, mielőtt a Java-ba kódolnánk őket.
Végül láttuk, hogy a Spring Security jelszótitkosító osztályokkal szállít, és különféle hash függvények tömbjét valósítja meg.
Mint mindig, a kód is elérhető a GitHubon.
Java alsó