java随即产生一个字母_java – 如何生成一个随机的字母数字字符串?

这里是安全,容易,但一点点更贵的会话标识符的代码。

import java.security.SecureRandom;

import java.math.BigInteger;

public final class SessionIdentifierGenerator {

private SecureRandom random = new SecureRandom();

public String nextSessionId() {

return new BigInteger(130, random).toString(32);

}

}

这通过从密码安全的随机比特生成器选择130比特并且在base-32中对它们进行编码来工作。 128位被认为是加密强的,但是基数32中的每个数字可以编码5位,因此128被舍入到下一个5的倍数。这种编码是紧凑和有效的,每个字符具有5个随机位。将此与随机UUID进行比较,在标准布局中每个字符只有3.4位,总共只有122个随机位。

如果允许会话标识符容易猜测(太短,有缺陷的随机数生成器等),攻击者可以劫持其他人的会话。注意,SecureRandom对象初始化起来很昂贵,所以你想保留一个并重用它。

这里是便宜,不安全的随机字母数字字符串的替代代码。如果要使用更多字符,可以调整“符号”。

public class RandomString {

private static final char[] symbols;

static {

StringBuilder tmp = new StringBuilder();

for (char ch = '0'; ch <= '9'; ++ch)

tmp.append(ch);

for (char ch = 'a'; ch <= 'z'; ++ch)

tmp.append(ch);

symbols = tmp.toString().toCharArray();

}

private final Random random = new Random();

private final char[] buf;

public RandomString(int length) {

if (length < 1)

throw new IllegalArgumentException("length < 1: " + length);

buf = new char[length];

}

public String nextString() {

for (int idx = 0; idx < buf.length; ++idx)

buf[idx] = symbols[random.nextInt(symbols.length)];

return new String(buf);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值