צור סיסמה אקראית מאובטחת ב- Java
רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:
>> בדוק את הקורס1. הקדמה
במדריך זה נבחן שיטות שונות בהן אנו יכולים להשתמש כדי ליצור סיסמה אקראית מאובטחת ב- Java.
בדוגמאות שלנו ניצור סיסמאות של עשר תווים, שכל אחת מהן כוללת מינימום שתי תווים קטנים, שתי תווים גדולים, שתי ספרות ושתי תווים מיוחדים.
2. שימוש בפסאי
Passay היא ספריית אכיפת מדיניות סיסמאות. יש לציין כי אנו יכולים להשתמש בספרייה כדי ליצור את הסיסמה באמצעות מערך חוקים הניתן להגדרה.
בעזרת ברירת המחדל CharacterData אנו יכולים לנסח את הכללים הנדרשים לסיסמה. יתר על כן, אנחנו יכולים לנסח מותאם אישית CharacterData יישומים שיתאימו לדרישותינו: הנה, יצרנו מותאם אישית CharacterData יישום לתווים מיוחדים. זה מאפשר לנו להגביל את קבוצת התווים התקפים המותרים. מלבד זאת, אנו משתמשים ביישומי ברירת מחדל של CharacterData לכללים האחרים שלנו. עכשיו, בואו נבדוק את הגנרטור שלנו מול בדיקת יחידה. למשל, אנו יכולים לבדוק נוכחות של שתי תווים מיוחדים: ראוי לציין זאת אף על פי ש- Passay הוא קוד פתוח, הוא מורשה כפול תחת LGPL ו- Apache 2. כמו בכל תוכנת צד שלישי, עלינו להיות בטוחים לציית לרישיונות אלה כאשר אנו משתמשים בה במוצרים שלנו. באתר GNU יש מידע נוסף על LGPL ועל Java. לאחר מכן, בואו נסתכל על RandomStringGenerator בטקסט של Apache Commons. עם RandomStringGenerator, אנו יכולים ליצור מחרוזות Unicode המכילות את מספר נקודות הקוד שצוין. כעת ניצור מופע של הגנרטור באמצעות ה- RandomStringGenerator.Builder מעמד. כמובן, אנו יכולים גם לתפעל עוד יותר את תכונות הגנרטור. בעזרת הבנאי אנו יכולים לשנות בקלות את יישום ברירת המחדל של האקראיות. יתר על כן, אנו יכולים גם להגדיר את התווים המותרים במחרוזת: כעת, מגבלת שימוש אחת RandomStringGenerator האם זה זה חסר את היכולת לציין את מספר התווים בכל קבוצה, כמו בפסאי. עם זאת, אנו יכולים לעקוף זאת על ידי מיזוג תוצאות קבוצות מרובות: לאחר מכן, בואו נאמת את הסיסמה שנוצרה על ידי אימות האותיות הקטנות: כברירת מחדל, RandomStringGenerator עושה שימוש ב ThreadLocalRandom לאקראיות. עכשיו חשוב להזכיר שזה לא מבטיח אבטחה הצפנתית. עם זאת, אנו יכולים להגדיר את מקור האקראיות באמצעות usingRandom (TextRandomProvider). למשל, אנו יכולים לעשות שימוש ב ספק SecureTextRandomProvider לאבטחה הצפנתית: אפשרות נוספת שנוכל להשתמש בה היא RandomStringUtils בכיתה בספריית Apache Commons Lang. מחלקה זו חושפת מספר שיטות סטטיות בהן אנו יכולים להשתמש לצורך הצהרת הבעיה שלנו. בואו נראה כיצד נוכל לספק את טווח נקודות הקוד המקובלות עבור הסיסמה: כדי לאמת את הסיסמה שנוצרה, בואו נוודא את מספר התווים המספריים: פה, RandomStringUtils עושה שימוש ב אַקרַאִי כברירת מחדל כמקור לאקראיות. עם זאת, קיימת שיטה בתוך הספרייה המאפשרת לנו לציין את מקור האקראיות: כעת נוכל להבטיח אבטחה קריפטוגרפית באמצעות מופע של SecureRandom. עם זאת, לא ניתן להרחיב פונקציונליות זו לשיטות אחרות בספריה. בהערה צדדית, אפאצ'י תומך בשימוש ב- RandomStringUtils למקרי שימוש פשוטים בלבד. אנו יכולים גם להשתמש ב- SecureRandom בכיתה ליצירת מחלקת שירות מותאמת אישית לתרחיש שלנו. בתור התחלה, בואו ניצור מחרוזת של תווים מיוחדים באורך שני: שימו לב לכך 33 ו 45 לציין את טווח תווי ה- Unicode. כעת אנו יכולים ליצור זרמים מרובים בהתאם לדרישותינו. אז נוכל למזג את ערכות התוצאות כדי ליצור את הסיסמה הנדרשת: עכשיו, בואו נאמת את הסיסמה שנוצרה עבור מספר התווים המיוחדים: במדריך זה הצלחנו ליצור סיסמאות העומדות בדרישותינו תוך שימוש בספריות שונות. כמו תמיד, דוגמאות הקוד המשמשות במאמר זמינות באתר GitHub.מחרוזת ציבורית 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); להחזיר סיסמה; }
@Test ציבורי בטל כאשר PasswordGeneratedUsingPassay_thenSuccessful () {RandomPasswordGenerator passGen = RandomPasswordGenerator חדש (); סיסמת מחרוזת = passGen.generatePassayPassword (); int specialCharCount = 0; עבור (char c: password.toCharArray ()) אם (c> = 33
3. שימוש RandomStringGenerator
מחרוזת ציבורית createRandomSpecialCharacters (אורך int) {RandomStringGenerator pwdGenerator = חדש RandomStringGenerator.Builder (). withinRange (33, 45) .build (); החזר pwdGenerator.generate (אורך); }
מחרוזת ציבורית 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 ())
מחרוזת ציבורית createRandomSpecialCharacters (int אורך) {SecureTextRandomProvider stp = חדש SecureTextRandomProvider (); RandomStringGenerator pwdGenerator = חדש RandomStringGenerator.Builder () .withinRange (33, 45) .usingRandom (stp) .build (); החזר pwdGenerator.generate (אורך); }
4. שימוש RandomStringUtils
מחרוזת ציבורית 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 ())
מחרוזת lowerCaseLetters = RandomStringUtils. אקראי (2, 97, 122, נכון, נכון, null, SecureRandom חדש ());
5. שימוש בשיטת שירות מותאמת אישית
זרם ציבורי getRandomSpecialChars (ספירת int) {אקראי אקראי = SecureRandom חדש (); IntStream specialChars = random.ints (ספירה, 33, 45); להחזיר specialChars.mapToObj (נתונים -> (char) נתונים); }
מחרוזת ציבורית 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. מסקנה
רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:
>> בדוק את הקורס