Jelszó birtoklása a Java-ban

Java Top

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 FOLYAMATOT

1. Á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:

  1. Kellene lennie meghatározó: ugyanazt az üzenetet kell feldolgozni ugyanazzal a hash függvénnyel mindig ugyanazt előállítani hash
  2. Ez nem megfordítható: nem praktikus a üzenet annak hash
  3. Magas entrópia: egy kis változás a üzenet nagyon eltérő eredményt kell előállítania hash
  4. É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 . 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ó

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 FOLYAMATOT