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

31

我正在使用以下方法生成随机字符串:

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

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

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


2
你不能这样将字节转换为字符串。数组的toString不是数组内容的字符串表示形式。SecureRandom按预期返回了512个字节。 - pvg
@pvg 我正在尝试生成一个令牌并将其保存在Postgres数据库中。我尝试了new String(bytes),但是我得到了一个invalid byte sequence for encoding "UTF8"错误。你能告诉我如何解决这个问题吗?谢谢! - kovac
你的问题是一个重复问题,请查看重复问题或者直接谷歌搜索“使用SecureRandom生成字符串令牌”,并从881123个解决方案中选择一个。 - pvg
1
不幸的是,StackOverflow已经成为一些人通过积累声望来证明自己“知识”的地方,而其中一个好的方法就是四处走动并在其他人的问题中完全超出范围且只是在编辑内容中表现。不要让他们阻碍你找到答案! - mohamnag
问题是如何使用安全随机生成给定长度的随机字符串?还是如何将任何字节数组编码为文本?这两个问题都是重复的。 - erickson
2个回答

54

我不明白为什么这个被标记为重复,因为显然“重复”的问题并没有问相同的问题 - 尽管下面有一个答案包含了这个信息。无论如何,如果有人需要,我要找的答案在下面。

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;
}

0

bytes.toString(); 是错误的,尝试使用 Arrays.toString(bytes) - 或者如果你想将它转换为字符串,可以使用 new String(bytes)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接