【发布时间】:2012-10-18 21:12:12
【问题描述】:
我想在 java 中生成随机标识符。标识符应该有一个固定的大小,两次生成相同标识符的概率应该很低(系统大约有50万用户)。另外;标识符应该很长,以至于通过暴力攻击“猜测”是不可行的。
到目前为止,我的方法是这样的:
String alphabet = "0123456789ABCDE....and so on";
int lengthOfAlphabet = 42;
long length = 12;
public String generateIdentifier(){
String identifier = "";
Random random = new Random();
for(int i = 0;i<length;i++){
identifier+= alphabet.charAt(random.nextInt(lengthOfAlphabet));
}
return identifier;
}
我通过数据库中的约束来强制执行唯一性。如果我点击了一个已经创建的标识符,我将继续生成,直到找到一个未使用的标识符。
我的假设是我可以调整 lenghtOfAlpahbet 和长度以获得我正在寻找的属性:
- 罕见的碰撞
- 暴力破解不可行
- 标识符应尽可能短,因为系统用户必须键入它。
这是一个好方法吗?有人对“长度”的价值有任何想法吗?
【问题讨论】:
-
开始之前:请说明
UUID.randomUUID()有什么问题?是不是太长了?它可以转换成更短的形式,例如以 base 64 编码。 -
真空量子涨落产生的真正随机数150.203.48.55/index.php
-
@Marko:我想问题是要求 #3。有更容易键入的随机标识符(但这可能只是格式化/解析的事情)。
-
@JoachimSauer 你认为我的想法是从 randomUUID 开始并将其后处理成更密集的东西,比如 base-64 表示?
-
还不错,马尔科。 @letterboy:请记住,非常长的随机字符串的替代方法是严重缩短该字符串的生命周期,并改用较短但寿命短的字符串。例如,与其创建一个巨大的、终身有效的身份验证令牌,不如生成一个短的(约 6 个字符)令牌,该令牌仅有效一次(并且在失效之前最多接受 2 次尝试)。通过这种方式,您可以让您的用户免于输入长字符串的痛苦,同时仍然获得高安全性。
标签: java security random statistics