Generate or validate a password Tag(s): Security
The generate() method produces a password with the following rules :
- Given a minimum and maximum length
- At least one lowercase letter
- At least one uppercase letter
- At least one digit
- No special character
The validate() method validates a password against the same rules.
import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PasswordTools { static String char_group = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static String digit_group = "123456789"; /** * Generate a password with lower/uppercase, digit, min/max length * @param min length * @param max length * @return password */ public static String generate(int min, int max) { if (min > max) { throw new IllegalArgumentException("min length > max length"); } Random ran = new Random(); int pwd_len = ran.nextInt(max + 1); while (pwd_len < min) { pwd_len = ran.nextInt(max + 1); } StringBuilder pwd = new StringBuilder(); Random RNG = new Random(); for (int i = 0; i < pwd_len ; i++) { int randomNum = RNG.nextInt(100); char c = ' '; // insert digit or letter if (randomNum % 4 == 0) { c = digit_group.charAt(randomNum % digit_group.length()); } else { c = char_group.charAt(randomNum % char_group.length()); } pwd.append(c); } return pwd.toString(); } /** * Validate password, check for with lower/uppercase, digit, min/max length, no special character * @param pwd * @param min min length * @param max max length * @return true/false */ public static boolean validate(String pwd, int min, int max) { if (pwd == null) { return false; } if (min > max) { throw new IllegalArgumentException("min length > max length"); } String regex = "^(?=.*[0-9])" // at least one digit + "(?=.*[a-z])" // at least one letter lowercase + "(?=.*[A-Z])" // at least one letter uppercase + "(?!.*[!@#&()-[{}]:;',?/*~$^+=<>\" `|\\[\\]\\\\])." // no special characters, no space + "{" + min + "," + max + "}$"; // min length, max length Pattern p = Pattern.compile(regex); Matcher m = p.matcher(pwd); return m.matches(); } public static void main(String args[]) { for (int i = 0; i < 10; i++) { System.out.println(PasswordTools.generate(6, 10)); } /* dV4hQ7v j2g8P1Y32 l781Y9NwQ D2wVbUz 4pN2TLn N35JnE387 8wbVxVzwBL dNbP4NzAr d2lk5k gIJUlsX3JM */ System.out.println(PasswordTools.validate("7DMJd26", 6, 10)); // true System.out.println(PasswordTools.validate("Jd26", 6, 10)); // false, too short System.out.println(PasswordTools.validate("7DMJd26Jd26", 6, 10)); // false, too long System.out.println(PasswordTools.validate("7DMJ d26", 6, 10)); // false, space System.out.println(PasswordTools.validate("7DMJ@d26", 6, 10)); // false, special character System.out.println(PasswordTools.validate("7dmjd26", 6, 10)); // false, no uppercase System.out.println(PasswordTools.validate("7DMJD26", 6, 10)); // false, no lowercase System.out.println(PasswordTools.validate("DDMJddd", 6, 10)); // false, no digit System.out.println(PasswordTools.validate("7777777", 6, 10)); // false, no letter } }
A simple way to generate using Apache Commons Lang is also provided. Add this to your POM to use it.
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.11</version> </dependency>
for (int i = 0; i < 10; i++) { System.out.println (org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric(6, 11)); // max length is exclusive so it's max length + 1 } /* ON7LQQ8 Grxjcl dKJHXFW9s pHwP05Y uKDIjP SzfYmhqP zW55VgJ2Z1 bzAb3uLxr 6NmT1Idli IkESyU6m */
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com