17

这是一个两部分的问题:

第1部分

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

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

第2部分

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

我知道的

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

扩大

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

TIA

4

3 回答 3

12

字符串的熵在这里有一个正式的定义: 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是一个 Map 其中 (key, value) 对应于(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:密码强度比熵要多得多。熵是关于不确定性;这并不一定意味着更高的安全性。例如:

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

于 2010-07-07T19:13:14.833 回答
1

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

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

于 2010-07-07T20:24:38.703 回答
1

要使用熵,您不仅需要获取单个密码的香农熵,还需要将其作为常用密码列表中的一个元素。如果密码与其他密码非常相似,那么与其他密码相比,它的熵将很低。如果它非常独特,它会更高。

于 2014-10-04T19:11:33.863 回答