【问题标题】:Just how much (or little) entropy passwords generated in this way have以这种方式生成的熵密码有多少(或很少)
【发布时间】: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


【解决方案1】:

假设Math.random()是不可预测的,对于randomCharacter函数,返回特定数字的概率是1/3 * 1/10,返回一个字母的概率是1/3 * 1/52

对于pw数组中的条目,有些字符是无效的,所以剩余字符的概率变高了。 您需要重新调整概率,使总和再次变为 1,即除以剩余概率的总和。 结果是一个数字的概率为1/3 * 1/10 / (8 * 1/3 * 1/10 + 47 * 1/3 * 1/52),而一个字母的概率为1/3 * 1/52 / (8 * 1/3 * 1/10 + 47 * 1/3 * 1/52)

将所有这些值插入到香农熵的公式中,得到每个字符大约 5.7 位熵的结果。

如果您使用包含 57 个有效字符的单个数组,并使用单个随机数对其进行索引,您将获得每个字符约 5.8 位的熵。

【讨论】:

  • 如果 Math.random() 只是一个 PRNG,并且不是理想的不可预测的,它仍然成立吗?我认为通常对于 PRNG 多次调用它以获得单个字符实际上会减少熵
  • 如果 PRNG 是可预测的,攻击者将能够预测您的密码,因此在这种情况下熵为零。
  • 我的意思是 PRNG 输出并不完全独立于以前的值。实际上,例如第二个字母的分布取决于第一个字母(这就是你通常想要使用加密 PRNG 的原因)。这显然会降低熵,但如何量化呢?
  • 这取决于 1)你如何量化 PRNG 的熵,以及 2)这对字母选择有多大影响(因为你取了一个 0 到 1 之间的随机数,但最终只使用信息是否存在,例如,在 0..1/3、1/3..2/3、2/3..1) 的区间内。
  • 是的,但这正是我遇到问题的部分,任何指针?
猜你喜欢
  • 2017-03-26
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2012-01-26
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多