对于 Java 8 及更高版本,最快和最简单的解决方案是:
private static final SecureRandom secureRandom = new SecureRandom(); //threadsafe
private static final Base64.Encoder base64Encoder = Base64.getUrlEncoder(); //threadsafe
public static String generateNewToken() {
byte[] randomBytes = new byte[24];
secureRandom.nextBytes(randomBytes);
return base64Encoder.encodeToString(randomBytes);
}
输出示例:
wrYl_zl_8dLXaZul7GcfpqmDqr7jEnli
7or_zct_ETxJnOa4ddaEzftNXbuvNSB-
CkZss7TdsTVHRHfqBMq_HqQUxBGCTgWj
8loHzi27gJTO1xTqTd9SkJGYP8rYlNQn
上面的代码将生成带有 32 个字符的 base64 编码的随机字符串。在 Base64 编码中,每个 char 编码 6 位数据。因此,对于上面示例中的 24 个字节,您将获得 32 个字符。您可以通过更改随机字节数来更改输出字符串的长度。此解决方案比UUID
(仅使用 16 个随机字节)更安全,并生成可安全用于 HTTP url 的字符串。