צור סיסמה אקראית מאובטחת ב- Java

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

במדריך זה נבחן שיטות שונות בהן אנו יכולים להשתמש כדי ליצור סיסמה אקראית מאובטחת ב- Java.

בדוגמאות שלנו ניצור סיסמאות של עשר תווים, שכל אחת מהן כוללת מינימום שתי תווים קטנים, שתי תווים גדולים, שתי ספרות ושתי תווים מיוחדים.

2. שימוש בפסאי

Passay היא ספריית אכיפת מדיניות סיסמאות. יש לציין כי אנו יכולים להשתמש בספרייה כדי ליצור את הסיסמה באמצעות מערך חוקים הניתן להגדרה.

בעזרת ברירת המחדל CharacterData אנו יכולים לנסח את הכללים הנדרשים לסיסמה. יתר על כן, אנחנו יכולים לנסח מותאם אישית CharacterData יישומים שיתאימו לדרישותינו:

מחרוזת ציבורית createPassayPassword () {PasswordGenerator gen = PasswordGenerator חדש (); CharacterData lowerCaseChars = אנגלית CharacterData.LowerCase; CharacterRule lowerCaseRule = CharacterRule חדש (lowerCaseChars); lowerCaseRule.setNumberOfCharacters (2); CharacterData upperCaseChars = EnglishCharacterData.UpperCase; CharacterRule upperCaseRule = CharacterRule חדש (upperCaseChars); upperCaseRule.setNumberOfCharacters (2); CharacterData digitChars = EnglishCharacterData.Digit; CharacterRule digitRule = CharacterRule חדש (digitChars); digitRule.setNumberOfCharacters (2); CharacterData specialChars = חדש CharacterData () {מחרוזת ציבורית getErrorCode () {return ERROR_CODE; } מחרוזת getCharacters ציבורית () {return "[email protected] # $% ^ & * () _ +"; }}; CharacterRule splCharRule = CharacterRule חדש (specialChars); splCharRule.setNumberOfCharacters (2); סיסמת מחרוזת = gen.generatePassword (10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); להחזיר סיסמה; }

הנה, יצרנו מותאם אישית CharacterData יישום לתווים מיוחדים. זה מאפשר לנו להגביל את קבוצת התווים התקפים המותרים.

מלבד זאת, אנו משתמשים ביישומי ברירת מחדל של CharacterData לכללים האחרים שלנו.

עכשיו, בואו נבדוק את הגנרטור שלנו מול בדיקת יחידה. למשל, אנו יכולים לבדוק נוכחות של שתי תווים מיוחדים:

@Test ציבורי בטל כאשר PasswordGeneratedUsingPassay_thenSuccessful () {RandomPasswordGenerator passGen = RandomPasswordGenerator חדש (); סיסמת מחרוזת = passGen.generatePassayPassword (); int specialCharCount = 0; עבור (char c: password.toCharArray ()) אם (c> = 33 

ראוי לציין זאת אף על פי ש- Passay הוא קוד פתוח, הוא מורשה כפול תחת LGPL ו- Apache 2. כמו בכל תוכנת צד שלישי, עלינו להיות בטוחים לציית לרישיונות אלה כאשר אנו משתמשים בה במוצרים שלנו. באתר GNU יש מידע נוסף על LGPL ועל Java.

3. שימוש RandomStringGenerator

לאחר מכן, בואו נסתכל על RandomStringGenerator בטקסט של Apache Commons. עם RandomStringGenerator, אנו יכולים ליצור מחרוזות Unicode המכילות את מספר נקודות הקוד שצוין.

כעת ניצור מופע של הגנרטור באמצעות ה- RandomStringGenerator.Builder מעמד. כמובן, אנו יכולים גם לתפעל עוד יותר את תכונות הגנרטור.

בעזרת הבנאי אנו יכולים לשנות בקלות את יישום ברירת המחדל של האקראיות. יתר על כן, אנו יכולים גם להגדיר את התווים המותרים במחרוזת:

מחרוזת ציבורית createRandomSpecialCharacters (אורך int) {RandomStringGenerator pwdGenerator = חדש RandomStringGenerator.Builder (). withinRange (33, 45) .build (); החזר pwdGenerator.generate (אורך); } 

כעת, מגבלת שימוש אחת RandomStringGenerator האם זה זה חסר את היכולת לציין את מספר התווים בכל קבוצה, כמו בפסאי. עם זאת, אנו יכולים לעקוף זאת על ידי מיזוג תוצאות קבוצות מרובות:

מחרוזת ציבורית createCommonTextPassword () {String pwString = createRandomSpecialCharacters (2) .concat (createRandomNumbers (2)) .concat (createRandomAlphabet (2, true)) .concat (generateRandomAlphabet (2, false)) .concat (generate 2) רשימה pwChars = pwString.chars () .mapToObj (נתונים -> (char) נתונים) .collect (Collectors.toList ()); Collections.shuffle (pwChars); סיסמת מחרוזת = pwChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); להחזיר סיסמה; }

לאחר מכן, בואו נאמת את הסיסמה שנוצרה על ידי אימות האותיות הקטנות:

@ מבחן ציבורי בטל כאשר PasswordGeneratedUsingCommonsText_thenSuccessful () {RandomPasswordGenerator passGen = RandomPasswordGenerator חדש (); סיסמת מחרוזת = passGen.generateCommonTextPassword (); int lowerCaseCount = 0; עבור (char c: password.toCharArray ()) 

כברירת מחדל, RandomStringGenerator עושה שימוש ב ThreadLocalRandom לאקראיות. עכשיו חשוב להזכיר שזה לא מבטיח אבטחה הצפנתית.

עם זאת, אנו יכולים להגדיר את מקור האקראיות באמצעות usingRandom (TextRandomProvider). למשל, אנו יכולים לעשות שימוש ב ספק SecureTextRandomProvider לאבטחה הצפנתית:

מחרוזת ציבורית createRandomSpecialCharacters (int אורך) {SecureTextRandomProvider stp = חדש SecureTextRandomProvider (); RandomStringGenerator pwdGenerator = חדש RandomStringGenerator.Builder () .withinRange (33, 45) .usingRandom (stp) .build (); החזר pwdGenerator.generate (אורך); }

4. שימוש RandomStringUtils

אפשרות נוספת שנוכל להשתמש בה היא RandomStringUtils בכיתה בספריית Apache Commons Lang. מחלקה זו חושפת מספר שיטות סטטיות בהן אנו יכולים להשתמש לצורך הצהרת הבעיה שלנו.

בואו נראה כיצד נוכל לספק את טווח נקודות הקוד המקובלות עבור הסיסמה:

 מחרוזת ציבורית createCommonLangPassword () {String upperCaseLetters = RandomStringUtils.random (2, 65, 90, true, true); מחרוזת lowerCaseLetters = RandomStringUtils.random (2, 97, 122, נכון, נכון); מספרי מחרוזות = RandomStringUtils.randomNumeric (2); String specialChar = RandomStringUtils.random (2, 33, 47, false, false); מחרוזת totalChars = RandomStringUtils.randomAlphanumeric (2); מחרוזת combinedChars = upperCaseLetters.concat (lowerCaseLetters) .concat (מספרים) .concat (specialChar) .concat (totalChars); רשימה pwdChars = combinedChars.chars () .mapToObj (c -> (char) c) .collect (Collectors.toList ()); Collections.shuffle (pwdChars); סיסמת מחרוזת = pwdChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); להחזיר סיסמה; }

כדי לאמת את הסיסמה שנוצרה, בואו נוודא את מספר התווים המספריים:

@Test הציבור בטל כאשר PasswordGeneratedUsingCommonsLang3_thenSuccessful () {RandomPasswordGenerator passGen = RandomPasswordGenerator חדש (); סיסמת מחרוזת = passGen.generateCommonsLang3Password (); int numCount = 0; עבור (char c: password.toCharArray ()) 

פה, RandomStringUtils עושה שימוש ב אַקרַאִי כברירת מחדל כמקור לאקראיות. עם זאת, קיימת שיטה בתוך הספרייה המאפשרת לנו לציין את מקור האקראיות:

מחרוזת lowerCaseLetters = RandomStringUtils. אקראי (2, 97, 122, נכון, נכון, null, SecureRandom חדש ());

כעת נוכל להבטיח אבטחה קריפטוגרפית באמצעות מופע של SecureRandom. עם זאת, לא ניתן להרחיב פונקציונליות זו לשיטות אחרות בספריה. בהערה צדדית, אפאצ'י תומך בשימוש ב- RandomStringUtils למקרי שימוש פשוטים בלבד.

5. שימוש בשיטת שירות מותאמת אישית

אנו יכולים גם להשתמש ב- SecureRandom בכיתה ליצירת מחלקת שירות מותאמת אישית לתרחיש שלנו. בתור התחלה, בואו ניצור מחרוזת של תווים מיוחדים באורך שני:

זרם ציבורי getRandomSpecialChars (ספירת int) {אקראי אקראי = SecureRandom חדש (); IntStream specialChars = random.ints (ספירה, 33, 45); להחזיר specialChars.mapToObj (נתונים -> (char) נתונים); }

שימו לב לכך 33 ו 45 לציין את טווח תווי ה- Unicode. כעת אנו יכולים ליצור זרמים מרובים בהתאם לדרישותינו. אז נוכל למזג את ערכות התוצאות כדי ליצור את הסיסמה הנדרשת:

מחרוזת ציבורית createSecureRandomPassword () {Stream pwdStream = Stream.concat (getRandomNumbers (2), Stream.concat (getRandomSpecialChars (2), Stream.concat (getRandomAlphabets (2, true), getRandomAlphabets (4, false)))); רשימה charList = pwdStream.collect (Collectors.toList ()); Collections.shuffle (charList); סיסמת מחרוזת = charList.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); להחזיר סיסמה; } 

עכשיו, בואו נאמת את הסיסמה שנוצרה עבור מספר התווים המיוחדים:

@ מבחן ציבורי בטל כאשר PasswordGeneratedUsingSecureRandom_thenSuccessful () {RandomPasswordGenerator passGen = חדש RandomPasswordGenerator (); סיסמת מחרוזת = passGen.generateSecureRandomPassword (); int specialCharCount = 0; עבור (char c: password.toCharArray ()) c = 2); 

6. מסקנה

במדריך זה הצלחנו ליצור סיסמאות העומדות בדרישותינו תוך שימוש בספריות שונות.

כמו תמיד, דוגמאות הקוד המשמשות במאמר זמינות באתר GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found