java - 生成包含字母数字和特殊字符的随机字符串?

标签 java string random passwords

我有兴趣生成具有以下属性的(安全)随机字符串:

  1. 至少 1 个大写字母
  2. 至少 1 个小写字母
  3. 至少 1 位数字(0-9)
  4. 字符 $&@ 中至少有一个特殊字符?<>~!%#

字符串的长度应为 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/

相关文章:

java - 关于模拟javamail

java - 为什么Integer.MIN_VALUE是-2^32而Integer.MAX_VALUE是2^31-1?

c++ - 如何获取字符串输出的宽度?

java - 如何编写一个由 5 个整数组成的随机数组,但不将 0 算作整数?

java - Servlet doGet、doPost 和 Ajax

java - 如何在 Drools 中处理动态 Json/类?

c++ - 字符常量数组为空,即使已为其分配值 [C++]

java - 无法在 java 中打印非常大的字符串(无论是在 Eclipse 中还是在 cmd 中)

math - 生成一定范围内的随机数

java - 如何随机化 RadioButton?