如何生成随机字母数字字符串?

您所在的位置:网站首页 java随机字母或者数字 如何生成随机字母数字字符串?

如何生成随机字母数字字符串?

2024-07-10 13:56:01| 来源: 网络整理| 查看: 265

算法

要生成随机字符串,请连接从可接受符号集中随机绘制的字符,直到字符串达到所需长度 .

实施

这是一些用于生成随机标识符的相当简单且非常灵活的代码 . 阅读以下重要应用说明的信息 .

import java.security.SecureRandom; import java.util.Locale; import java.util.Objects; import java.util.Random; public class RandomString { /** * Generate a random string. */ public String nextString() { for (int idx = 0; idx < buf.length; ++idx) buf[idx] = symbols[random.nextInt(symbols.length)]; return new String(buf); } public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String lower = upper.toLowerCase(Locale.ROOT); public static final String digits = "0123456789"; public static final String alphanum = upper + lower + digits; private final Random random; private final char[] symbols; private final char[] buf; public RandomString(int length, Random random, String symbols) { if (length < 1) throw new IllegalArgumentException(); if (symbols.length() < 2) throw new IllegalArgumentException(); this.random = Objects.requireNonNull(random); this.symbols = symbols.toCharArray(); this.buf = new char[length]; } /** * Create an alphanumeric string generator. */ public RandomString(int length, Random random) { this(length, random, alphanum); } /** * Create an alphanumeric strings from a secure generator. */ public RandomString(int length) { this(length, new SecureRandom()); } /** * Create session identifiers. */ public RandomString() { this(21); } } 用法示例

为8个字符的标识符创建一个不安全的生成器:

RandomString gen = new RandomString(8, ThreadLocalRandom.current());

为会话标识符创建安全的生成器:

RandomString session = new RandomString();

创建一个带有易于阅读的打印代码的生成器 . 字符串比完整的字母数字字符串长,以补偿使用更少的符号:

String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx"; RandomString tickets = new RandomString(23, new SecureRandom(), easy); 用作会话标识符

生成可能唯一的会话标识符不够好,或者您可以使用简单的计数器 . 当使用可预测的标识符时,攻击者劫持会话 .

长度和安全之间存在紧张关系 . 较短的标识符更容易猜测,因为可能性较小 . 但是更长的标识符会消耗更多的存储空间较大的符号集会有所帮助,但如果标识符包含在URL中或手动重新输入,则可能会导致编码问题 .

会话标识符的随机性或熵的基础源应来自为加密设计的随机数生成器 . 但是,初始化这些生成器有时可能在计算上很昂贵或很慢,因此应尽可能地重新使用它们 .

用作对象标识符

并非每个应用程序都需要安随机分配可以是多个实体在没有任何协调或分区的情况下在共享空间中生成标识符的有效方式 . 协调可能很慢,特别是在集群或分布式环境中,当实体最终使用太小或太大的共享时,拆分空间会导致问题 .

如果攻击者可能能够查看和操纵它们,那么在不采取措施使其不可预测的情况下生成的标识符应该受到其他方式的保护,就像在大多数Web应用程序中一样 . 应该有一个单独的授权系统来保护攻击者可以在没有访问权限的情况下猜出其标识符的对象 .

还必须注意使用足够长的标识符,以便在给定预期的标识符总数的情况下不太可能发生冲突 . 这被称为"the birthday paradox." The probability of a collision,p,大约是n2 /(2qx),其中n是实际生成的标识符的数量,q是字母表中不同符号的数量,x是标识符的长度 . 这应该是一个非常小的数字,如2-50或更少 .

解决这个问题表明,500k 15个字符标识符之间碰撞的可能性大约为2-52,这可能不如宇宙射线未检测到的错误等 .

与UUID的比较

根据他们的规范,UUID不是不可预测的,不应该用作会话标识符 .

标准格式的UUID需要占用大量空间:36个字符,仅有122位熵 . (并非随机选择“随机”UUID的所有位 . )随机选择的字母数字字符串仅包含21个字符的更多熵 .

UUID不灵活;他们有一个标准化的结构和布局 . 这是他们的主要优点,也是他们的主要弱点 . 与外部团队合作时,UUID提供的标准化可能会有所帮助 . 对于纯粹的内部使用,它们可能效率低下 .



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭