我有兴趣生成具有以下属性的(安全)随机字符串:
- 至少 1 个大写字母
- 至少 1 个小写字母
- 至少 1 位数字(0-9)
- 字符 $&@ 中至少有一个特殊字符?<>~!%#
字符串的长度应为 12-13 个数字/字符。
我知道 Apache commons 中有一个类可以帮助生成随机字符串,但是没有选项可以包含特殊字符。
我还知道有关 SO 的其他一些类似问题,但它们都没有完全解决这些要求。
到目前为止我已经尝试过以下操作:
import java.security.SecureRandom;
public final class SessionIdentifierGenerator {
private SecureRandom random = new SecureRandom();
public String nextSessionId() {
return
new BigInteger(130, random).toString(32);
}
}
但它不包含 4 个点中每个点的字符集。
我也尝试过:
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static Random rnd = new Random();
String randomString( int len )
{
StringBuilder sb = new StringBuilder( len );
for(int i = 0; i < len; i++)
sb.append(AB.charAt( rnd.nextInt(AB.length())));
return sb.toString();
}
我知道我可以修改字符串 AB 以包含特殊字符,但无法保证字符串至少包含 1 个大写字母、1 个小写字母、1 个数字和 1 个特殊字符。
我正在使用 Java。
最佳答案
根据您的情况,最简单的方法是生成包含任何允许的符号的随 secret 码,然后测试是否满足条件:
private static final String symbols =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$&@?<>~!%#";
public static String genPassword(Random r) {
while(true) {
char[] password = new char[r.nextBoolean()?12:13];
boolean hasUpper = false, hasLower = false, hasDigit = false, hasSpecial = false;
for(int i=0; i<password.length; i++) {
char ch = symbols.charAt(r.nextInt(symbols.length()));
if(Character.isUpperCase(ch))
hasUpper = true;
else if(Character.isLowerCase(ch))
hasLower = true;
else if(Character.isDigit(ch))
hasDigit = true;
else
hasSpecial = true;
password[i] = ch;
}
if(hasUpper && hasLower && hasDigit && hasSpecial) {
return new String(password);
}
}
}
根据我的测试,所需的迭代次数很少超过 5 次,并且在超过一半的测试中,第一个生成的密码符合标准。但不要强制您的用户记住此类密码!它们的外观如下:
c3h$oyuKcZZl
Si4e8F4sWjy#i
V$9WwW7zJ8ba
~9htwMwcFc!s
wBm94~AH%z%MU
p4TE36S&Y>J14
R9Bsqq@23eYk
PTfcvR5u?piZQ
CE8ot>a74PmZP
4zAco~P6Xuf3E
aiv?VDN4j9pE
关于java - 生成包含字母数字和特殊字符的随机字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039134/