Generáljon biztonságos véletlenszerű jelszót 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. Bemutatkozás
Ebben az oktatóanyagban különféle módszereket vizsgálunk meg, amelyek segítségével biztonságos véletlenszerű jelszót generálhatunk a Java-ban.
Példáinkban tíz karakterből álló jelszavakat állítunk elő, amelyek mindegyikében legalább két kisbetű, két nagybetű, két számjegy és két speciális karakter szerepel.
2. A Passay használata
A Passay egy jelszóházirend-végrehajtási könyvtár. Különösen a könyvtárat használhatjuk a jelszó előállításához egy konfigurálható szabálykészlet segítségével.
Az alapértelmezett segítségével CharacterData megvalósítások során megfogalmazhatjuk a jelszóhoz szükséges szabályokat. Továbbá tudjuk megfogalmazza a szokást CharacterData igényeinknek megfelelő megvalósítások: Itt létrehoztunk egy szokást CharacterData speciális karakterek megvalósítása. Ez lehetővé teszi számunkra, hogy korlátozzuk az érvényes karakterek halmazát. Ettől eltekintve a CharacterData más szabályainkért. Most ellenőrizzük a generátorunkat egy egység teszt alapján. Például két speciális karakter jelenlétét ellenőrizhetjük: Érdemes ezt megjegyezni bár a Passay nyílt forráskódú, kettős licenccel rendelkezik mind az LGPL, mind az Apache 2 alatt. Mint minden harmadik féltől származó szoftver esetében, a termékeinkben történő felhasználáskor is mindenképpen be kell tartanunk ezeket a licenceket. A GNU webhelyén további információk találhatók az LGPL-ről és a Java-ról. Ezután nézzük meg a RandomStringGenerator az Apache Commons szövegben. Val vel RandomStringGenerator, generálhatunk Unicode karakterláncokat, amelyek a megadott számú kódpontot tartalmazzák. Most létrehozunk egy példát a generátorról a RandomStringGenerator.Builder osztály. Természetesen a generátor tulajdonságait is tovább manipulálhatjuk. Az építő segítségével könnyen megváltoztathatjuk a véletlenszerűség alapértelmezett megvalósítását. Ezenkívül meghatározhatjuk a karakterláncban megengedett karaktereket is: Most a használat egyik korlátozása RandomStringGenerator az, hogy nem tudja megadni az egyes halmazok karaktereinek számát, például a Passay-ben. Ezt azonban megkerülhetjük több halmaz eredményének egyesítésével: Ezután ellenőrizzük a generált jelszót a kisbetűk ellenőrzésével: Alapértelmezés szerint, RandomStringGenerator felhasználja ThreadLocalRandom a véletlenszerűségért. Most fontos megemlíteni hogy ez nem biztosítja a kriptográfiai biztonságot. Azonban a véletlenszerűség forrását használhatjuk usingRandom (TextRandomProvider). Például használhatjuk SecureTextRandomProvider titkosítási biztonság: Egy másik lehetőség, amelyet alkalmazhatunk, a RandomStringUtils osztály az Apache Commons Lang könyvtárban. Ez az osztály számos statikus módszert tár fel, amelyeket problémamegállapításunkhoz használhatunk. Nézzük meg, hogyan tudjuk megadni a jelszó számára elfogadható kódpontok tartományát: A generált jelszó érvényesítéséhez ellenőrizzük a numerikus karakterek számát: Itt, RandomStringUtils felhasználja Véletlen alapértelmezés szerint a véletlenszerűség forrása. Van azonban egy módszer a könyvtárban, amely lehetővé teszi a véletlenszerűség forrásának megadását: Most a kriptográfiai biztonságot a SecureRandom. Ez a funkció azonban nem bővíthető a könyvtár más módszereire. Mellékesen: Az Apache támogatja a RandomStringUtils csak egyszerű használatra. Használhatjuk a SecureRandom osztály egy egyéni segédprogram osztály létrehozásához a forgatókönyvünkhöz. Kezdetnek generáljunk egy két hosszúságú speciális karaktert: Ezt is vegye észre 33 és 45 jelölje az Unicode karakterek tartományát. Most több adatfolyamot is létrehozhatunk a követelményeinknek megfelelően. Ezután egyesíthetjük az eredményhalmazokat a szükséges jelszó előállításához: Most ellenőrizzük a létrehozott jelszót a speciális karakterek számához: Ebben az oktatóanyagban az igényeinknek megfelelő jelszavakat tudtunk előállítani különböző könyvtárak segítségével. Mint mindig, a cikkben használt kódminták elérhetők a GitHubon.public String genePassayPassword () {PasswordGenerator gen = new PasswordGenerator (); CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; CharacterRule lowerCaseRule = új CharacterRule (lowerCaseChars); lowerCaseRule.setNumberOfCharacters (2); CharacterData upperCaseChars = EnglishCharacterData.UpperCase; CharacterRule upperCaseRule = új CharacterRule (upperCaseChars); upperCaseRule.setNumberOfCharacters (2); CharacterData digitChars = EnglishCharacterData.Digit; CharacterRule digitRule = new CharacterRule (digitChars); digitRule.setNumberOfCharacters (2); CharacterData specialChars = new CharacterData () {public String getErrorCode () {return ERROR_CODE; } public String getCharacters () {return "[email protected] # $% ^ & * () _ +"; }}; CharacterRule splCharRule = új CharacterRule (specialChars); splCharRule.setNumberOfCharacters (2); Karakterlánc-jelszó = gen.generatePassword (10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); jelszó visszaküldése; }
@Test public void whenPasswordGeneratedUsingPassay_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generatePassayPassword (); int specialCharCount = 0; for (char c: jelszó.toCharArray ()) ha (c> = 33
3. Használata RandomStringGenerator
public String geneRandomSpecialCharacters (int hosszúság) {RandomStringGenerator pwdGenerator = új RandomStringGenerator.Builder (). withinRange (33, 45) .build (); return pwdGenerator.generate (hossz); }
public String generálCommonTextPassword () {Karakterlánc pwString = generálRandomSpecialCharacters (2) .concat (generátorRandomNumbers (2)) .concat (generátorRandomAlphabet (2, igaz)) .concat (generátorRandomAlphabet (2, hamis)) 2concat (2) Sorolja fel a pwChars = pwString.chars () .mapToObj (adatok -> (char) adatok) .collect (Collectors.toList ()); Collections.shuffle (pwChars); Karakterlánc jelszó = pwChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; }
@Test public void whenPasswordGeneratedUsingCommonsText_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateCommonTextPassword (); int alsóCaseCount = 0; for (char c: password.toCharArray ())
public String geneRandomSpecialCharacters (int hossz) {SecureTextRandomProvider stp = new SecureTextRandomProvider (); RandomStringGenerator pwdGenerator = új RandomStringGenerator.Builder () .withinRange (33, 45) .usingRandom (stp) .build (); return pwdGenerator.generate (hossz); }
4. Használata RandomStringUtils
public String generálCommonLangPassword () {String upperCaseLetters = RandomStringUtils.random (2, 65, 90, igaz, igaz); String lowerCaseLetters = RandomStringUtils.random (2, 97, 122, igaz, igaz); Karakterláncok = RandomStringUtils.randomNumeric (2); String specialChar = RandomStringUtils.random (2, 33, 47, hamis, hamis); String totalChars = RandomStringUtils.randomAlphanumeric (2); Karakterlánc kombináltChars = upperCaseLetters.concat (alsóCaseLetters) .concat (számok) .concat (specialChar) .concat (totalChars); Sorolja fel a pwdChars = combinedChars.chars () .mapToObj (c -> (char) c) .collect (Collectors.toList ()); Collections.shuffle (pwdChars); Karakterlánc jelszó = pwdChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; }
@Test public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateCommonsLang3Password (); int számSzám = 0; for (char c: password.toCharArray ())
String lowerCaseLetters = RandomStringUtils. random (2, 97, 122, true, true, null, new SecureRandom ());
5. Egyedi segédprogram módszer használata
public Stream getRandomSpecialChars (int szám) {Random random = new SecureRandom (); IntStream specialChars = random.ints (szám, 33, 45); return specialChars.mapToObj (adatok -> (char) adatok); }
public String geneSecureRandomPassword () {Stream pwdStream = Stream.concat (getRandomNumbers (2), Stream.concat (getRandomSpecialChars (2), Stream.concat (getRandomAlphabets (2, true), getRandomAlphabets) (4, hamis) List charList = pwdStream.collect (Collectors.toList ()); Collections.shuffle (charList); Karakterlánc jelszó = charList.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; }
@Test public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateSecureRandomPassword (); int specialCharCount = 0; for (char c: jelszó.toCharArray ()) c = 2);
6. Következtetés
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