如何在 Java 中生成长度为 n 的 SecureRandom 字符串? [复制]

Posted

技术标签:

【中文标题】如何在 Java 中生成长度为 n 的 SecureRandom 字符串? [复制]【英文标题】:How to generate a SecureRandom string of length n in Java? [duplicate] 【发布时间】:2018-02-25 21:56:28 【问题描述】:

我正在生成一个随机字符串:

private String generateSafeToken() 
    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[512];
    random.nextBytes(bytes);
    return bytes.toString();

这给出了一个长度为 11 的字符串,例如 [B@70ffc557。如何使上述方法返回指定长度的字符串。例如 20 个字符?

【问题讨论】:

您不能将字节转换为这样的字符串。数组的 toString 不是数组内容的字符串表示形式。 SecureRandom 按预期返回 512 个字节。 @pvg 我正在尝试生成一个令牌并将其保存在 Postgres 数据库中。我试过new String(bytes),但我收到invalid byte sequence for encoding "UTF8" 错误。你能告诉我该怎么做吗? 您的问题是重复的,请查看重复的问题,或者直接在 google 上“使用安全随机生成字符串令牌”并选择 881123 解决方案之一。 不幸的是,*** 已经成为一些人通过收集 repotation 来证明他们的“知识”的地方,而其中一种好方法是完全超出范围并仅在编辑上下文中解决和处理他人的问题.不要让他们阻止您找到答案! 问题是如何使用安全随机生成给定长度的随机字符串?或者如何将任何字节数组编码为文本?两个问题都是重复的。 【参考方案1】:

我不明白为什么这里提到的“重复”问题显然没有问相同的问题时为什么会被标记为重复 - 尽管下面的答案包含此信息。无论如何,我正在寻找的答案如下,以防它对其他人有帮助。

private String generateSafeToken() 
    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[20];
    random.nextBytes(bytes);
    Encoder encoder = Base64.getUrlEncoder().withoutPadding();
    String token = encoder.encodeToString(bytes);
    return token;

【讨论】:

【参考方案2】:

bytes.toString();错了,尝试使用 Arrays.toString(bytes) - 或者 new String(bytes) 如果你想将其转换为字符串。

【讨论】:

以上是关于如何在 Java 中生成长度为 n 的 SecureRandom 字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Java ME/J2ME 中生成随机十六进制字符串(长度为 50)

在java中生成6位pin

java 在java中生成一定长度的整数数组

如何在 Java 中生成随机排列?

从给定的单词列表中生成具有“N”长度的所有可能组合(寻找不重复)

在 Python 3 中生成具有随机长度的类随机唯一字符串的最快方法