发布日期:2018-03-26
如何使用JAVA生成一个随机的包含字母和数字字符串?有木有示例代码呢?+ 查看更多
如何使用JAVA生成一个随机的包含字母和数字字符串?有木有示例代码呢?
+ 查看更多
发布日期:2018-03-10 14:06
分类:JAVA
浏览次数:204
我一直在寻找一个简单的Java算法来生成伪随机字母数字字符串。 我的想法是它将被用作一个唯一的会话/密钥标识符,“likely”是唯一的超过500K +(我的需求真的不需要其他的变得更复杂)。 理想情况下,我可以根据我的唯一性需要指定长度。 例如,生成的长度为12的字符串可能就是“AEYGF7K0DM1X”。
回答:
这代码安全、简单, 但生成Session标识符开销比较大。
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); } }