帮助计算密码熵(和有用性)

2022-08-30 23:39:40

这是一个由两部分组成的问题:

第 1 部分

首先,处理在PHP中计算密码的熵。我无法找到任何经验上合理的代码示例,并且真的希望获得一些帮助,以找到计算最终数字的“正确”方法。网络上的很多人都有自己的自制加权算法,但我真的在寻找这个等式的科学答案。

我将使用密码熵作为更大安全系统的一部分,并作为一种分析我们整体数据安全性的方法,该方法基于用户密码受到损害时可访问的信息以及密码被暴力破解的难易程度。

第 2 部分

这个问题的第二部分是:这个数字到底有多大用处?我的最终目标是为系统中的每个密码生成一个“分数”,我们可以使用它来监控我们作为一个动态实体的整体系统安全性。我可能不得不使用另一种或两种算法来处理字典攻击,l33t替换密码等 - 但我确实觉得熵将在这样的“整体”系统评级中发挥重要作用。不过,我确实欢迎对其他方法的建议。

我所知道的

我看到过一些提到对数方程来计算所述熵,但我还没有看到一个很好的例子,实际上并没有写成数学方程。我真的可以使用一个代码示例(即使不是严格意义上的PHP)来让我继续前进。

外延

在发表评论时,我意识到我可以更好地解释这种计算的有用性。当我在用户密码非常弱的旧系统上工作时,我必须有一些具体的证据来证明这个弱点,然后才能提出强制所有用户将其密码更改为新的(强制的)强密码的理由。通过在系统中存储每个用户帐户的密码强度分数,我可以构建几个不同的指标来显示整体系统弱点,并为更强的密码提供理由。

断续器


答案 1

字符串的熵有一个正式的定义,在这里指定:http://en.wikipedia.org/wiki/Entropy_(information_theory)

这个值有多大用处?这要视情况而定。下面是一个计算熵的方法(在Java中),我为赋值做了一个:

public static double entropy() {
   double h = 0, p;
   for (int i = 0; i < count.size(); i++){
      p = count.get(i)/(totalChars*1.0);
      h -= p*Math.log(p)/Math.log(2);
   }
   return h;
}

count是一个映射,其中(键、值)对应于 。这显然意味着在调用此方法之前必须处理字符串。(char, countForChar)

编辑2:这是相同的方法,用PHP重写

function entropy($string) {
   $h=0;
   $size = strlen($string);
   foreach (count_chars($string, 1) as $v) {
      $p = $v/$size;
      $h -= $p*log($p)/log(2);
   }
   return $h;
}

编辑3:密码强度比熵要多得多。熵是关于不确定性的;这并不一定意味着更高的安全性。例如:

的熵为 2.5,而 的熵为 2.75"akj@!0aj""password"


答案 2

强制一定程度的熵是CWE-521的要求

(1)最小和最大长度;
(2)要求混合字符集(字母,数字,特殊,混合大小写);
(3)不包含用户名;
(4)有效期;
(5)禁止重复使用密码。


推荐