重置密码是比较常见的操作,通常要求生成比较复杂的随机密码,比如要求长度九位,并且包含数字、大小写和特殊字符。
- 数字字符通常要求去掉
0和1
,因为容易和字母o、i
混淆 - 字母通常要求去掉的
L、I、J、O、l、i、j、o
,也是容易混淆 - 特殊字符也要去掉很多,因为很多用户对键盘上的特殊字符不敏感,可能某个字符需要找半天,所以通常会保留显眼位置上的特殊字符,比如
!@#$%^&*
示例代码:
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class GeneratePassword {
private static final String lowStr = "abcdefghkmnpqrstuvwxyz";
private static final String upperStr = "ABCDEFGHKMNPQRSTUVWXYZ";
private static final String specialStr = "!@#$%^&*";
private static final String numStr = "23456789";
// 随机获取字符串字符
private static char getRandomChar(String str) {
SecureRandom random = new SecureRandom();
return str.charAt(random.nextInt(str.length()));
}
//获取大写字符
private static char getUpperChar() {
return getRandomChar(upperStr);
}
//获取小写字符
private static char getLowChar() {
return getRandomChar(lowStr);
}
//获取数字字符
private static char getNumberChar() {
return getRandomChar(numStr);
}
//获取特殊字符
private static char getSpecialChar() {
return getRandomChar(specialStr);
}
//随机从大写、小写、特殊和数字字符中选取一个字符
private static char getRandomChar(int num) {
switch (num) {
case 0:
return getUpperChar();
case 1:
return getLowChar();
case 2:
return getSpecialChar();
default:
return getNumberChar();
}
}
private static String generatePassword(int len) {
List<Character> list = new ArrayList<>();
//保证大写字符、小写字符、特殊字符和数字字符至少有一个
list.add(getLowChar());
list.add(getUpperChar());
list.add(getNumberChar());
list.add(getSpecialChar());
SecureRandom random = new SecureRandom();
for (int i = 4; i < len; i++) {
int num = random.nextInt(4);
list.add(getRandomChar(num));
}
//打乱顺序
Collections.shuffle(list);
StringBuffer sb = new StringBuffer();
for (Character ch : list) {
sb.append(ch);
}
return sb.toString();
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(generatePassword(9));
}
}
}
原文地址:https://blog.youkuaiyun.com/qingquanyingyue/article/details/106336742,在此基础上修改的。