|
| 1 | +package com.baeldung.string.password; |
| 2 | + |
| 3 | +import java.security.SecureRandom; |
| 4 | +import java.util.Collections; |
| 5 | +import java.util.List; |
| 6 | +import java.util.Random; |
| 7 | +import java.util.stream.Collectors; |
| 8 | +import java.util.stream.IntStream; |
| 9 | +import java.util.stream.Stream; |
| 10 | + |
| 11 | +import org.apache.commons.lang3.RandomStringUtils; |
| 12 | +import org.apache.commons.text.RandomStringGenerator; |
| 13 | +import org.passay.CharacterData; |
| 14 | +import org.passay.CharacterRule; |
| 15 | +import org.passay.EnglishCharacterData; |
| 16 | +import org.passay.PasswordGenerator; |
| 17 | + |
| 18 | +public class RandomPasswordGenerator { |
| 19 | + |
| 20 | + /** |
| 21 | + * Special characters allowed in password. |
| 22 | + */ |
| 23 | + public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+"; |
| 24 | + |
| 25 | + public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS"; |
| 26 | + |
| 27 | + Random random = new SecureRandom(); |
| 28 | + |
| 29 | + public String generatePassayPassword() { |
| 30 | + PasswordGenerator gen = new PasswordGenerator(); |
| 31 | + CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; |
| 32 | + CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars); |
| 33 | + lowerCaseRule.setNumberOfCharacters(2); |
| 34 | + CharacterData upperCaseChars = EnglishCharacterData.UpperCase; |
| 35 | + CharacterRule upperCaseRule = new CharacterRule(upperCaseChars); |
| 36 | + upperCaseRule.setNumberOfCharacters(2); |
| 37 | + CharacterData digitChars = EnglishCharacterData.Digit; |
| 38 | + CharacterRule digitRule = new CharacterRule(digitChars); |
| 39 | + digitRule.setNumberOfCharacters(2); |
| 40 | + CharacterData specialChars = new CharacterData() { |
| 41 | + public String getErrorCode() { |
| 42 | + return ERROR_CODE; |
| 43 | + } |
| 44 | + |
| 45 | + public String getCharacters() { |
| 46 | + return ALLOWED_SPL_CHARACTERS; |
| 47 | + } |
| 48 | + }; |
| 49 | + CharacterRule splCharRule = new CharacterRule(specialChars); |
| 50 | + splCharRule.setNumberOfCharacters(2); |
| 51 | + String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); |
| 52 | + return password; |
| 53 | + } |
| 54 | + |
| 55 | + public String generateCommonTextPassword() { |
| 56 | + String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2)) |
| 57 | + .concat(generateRandomAlphabet(2, true)) |
| 58 | + .concat(generateRandomAlphabet(2, false)) |
| 59 | + .concat(generateRandomCharacters(2)); |
| 60 | + List<Character> pwChars = pwString.chars() |
| 61 | + .mapToObj(data -> (char) data) |
| 62 | + .collect(Collectors.toList()); |
| 63 | + Collections.shuffle(pwChars); |
| 64 | + String password = pwChars.stream() |
| 65 | + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) |
| 66 | + .toString(); |
| 67 | + return password; |
| 68 | + } |
| 69 | + |
| 70 | + public String generateCommonsLang3Password() { |
| 71 | + String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true); |
| 72 | + String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true); |
| 73 | + String numbers = RandomStringUtils.randomNumeric(2); |
| 74 | + String specialChar = RandomStringUtils.random(2, 33, 47, false, false); |
| 75 | + String totalChars = RandomStringUtils.randomAlphanumeric(2); |
| 76 | + String combinedChars = upperCaseLetters.concat(lowerCaseLetters) |
| 77 | + .concat(numbers) |
| 78 | + .concat(specialChar) |
| 79 | + .concat(totalChars); |
| 80 | + List<Character> pwdChars = combinedChars.chars() |
| 81 | + .mapToObj(c -> (char) c) |
| 82 | + .collect(Collectors.toList()); |
| 83 | + Collections.shuffle(pwdChars); |
| 84 | + String password = pwdChars.stream() |
| 85 | + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) |
| 86 | + .toString(); |
| 87 | + return password; |
| 88 | + } |
| 89 | + |
| 90 | + public String generateSecureRandomPassword() { |
| 91 | + Stream<Character> pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false)))); |
| 92 | + List<Character> charList = pwdStream.collect(Collectors.toList()); |
| 93 | + Collections.shuffle(charList); |
| 94 | + String password = charList.stream() |
| 95 | + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) |
| 96 | + .toString(); |
| 97 | + return password; |
| 98 | + } |
| 99 | + |
| 100 | + public String generateRandomSpecialCharacters(int length) { |
| 101 | + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45) |
| 102 | + .build(); |
| 103 | + return pwdGenerator.generate(length); |
| 104 | + } |
| 105 | + |
| 106 | + public String generateRandomNumbers(int length) { |
| 107 | + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) |
| 108 | + .build(); |
| 109 | + return pwdGenerator.generate(length); |
| 110 | + } |
| 111 | + |
| 112 | + public String generateRandomCharacters(int length) { |
| 113 | + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) |
| 114 | + .build(); |
| 115 | + return pwdGenerator.generate(length); |
| 116 | + } |
| 117 | + |
| 118 | + public String generateRandomAlphabet(int length, boolean lowerCase) { |
| 119 | + int low; |
| 120 | + int hi; |
| 121 | + if (lowerCase) { |
| 122 | + low = 97; |
| 123 | + hi = 122; |
| 124 | + } else { |
| 125 | + low = 65; |
| 126 | + hi = 90; |
| 127 | + } |
| 128 | + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi) |
| 129 | + .build(); |
| 130 | + return pwdGenerator.generate(length); |
| 131 | + } |
| 132 | + |
| 133 | + public Stream<Character> getRandomAlphabets(int count, boolean upperCase) { |
| 134 | + IntStream characters = null; |
| 135 | + if (upperCase) { |
| 136 | + characters = random.ints(count, 65, 90); |
| 137 | + } else { |
| 138 | + characters = random.ints(count, 97, 122); |
| 139 | + } |
| 140 | + return characters.mapToObj(data -> (char) data); |
| 141 | + } |
| 142 | + |
| 143 | + public Stream<Character> getRandomNumbers(int count) { |
| 144 | + IntStream numbers = random.ints(count, 48, 57); |
| 145 | + return numbers.mapToObj(data -> (char) data); |
| 146 | + } |
| 147 | + |
| 148 | + public Stream<Character> getRandomSpecialChars(int count) { |
| 149 | + IntStream specialChars = random.ints(count, 33, 45); |
| 150 | + return specialChars.mapToObj(data -> (char) data); |
| 151 | + } |
| 152 | +} |
0 commit comments