【发布时间】:2014-04-07 09:46:53
【问题描述】:
所以我知道以以下方式生成密码是个坏主意。我会说它只有少量(可能是 5 左右)位熵,但我无法正确计算它。
谁能告诉我,如何计算使用 Oracle 的 JDK 7 以以下方式生成的长度为 n 的密码的平均尝试次数?
我假设相关因素是:
- 字母大小(62 - 5 用于限制看起来令人困惑的字符),
- 两步过程选择字符类,然后选择字符,
- 四舍五入到整数,
- 尝试直到成功采样字符的方式,
- Math.random() 的内在属性。
但我无法得到确切的数字。
char[] generate(int n) {
char[] pw = new char[n];
for (int i = 0; i < n; i++) {
int c;
while (true) {
c = randomCharacter(c);
if (c == '0' || c == 'O' || c == 'I' || c == '1' || c == 'l')
continue;
else
break;
}
pw[i] = (char) c;
}
return pw;
}
int randomCharacter(int c) {
switch ((int) (Math.random() * 3)) {
case 0:
c = '0' + (int) (Math.random() * 10);
break;
case 1:
c = 'a' + (int) (Math.random() * 26);
break;
case 2:
c = 'A' + (int) (Math.random() * 26);
break;
}
return c;
}
【问题讨论】:
-
Math.random的内在属性取决于它的实现。你没有指定一个。你甚至没有指定语言(我猜是java)。 -
好点,我遇到了标签限制,忘了在别处提及。
标签: security random passwords brute-force entropy