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

Sha*_*ane 15 php security passwords algorithm entropy

这是一个两部分问题:

第1部分

首先,处理在PHP中计算密码的熵.我一直无法找到任何经验合理的代码示例,并且非常希望找到一种帮助来找到计算最终数字的"正确"方法.网上的很多人都有他们自己的家庭烘焙加权算法,但我真的在寻找科学的答案.

我将使用密码熵作为更大安全系统的一部分,并根据用户密码被泄露时可访问的信息以及蛮力破解密码的方式来分析我们的整体数据安全性.

第2部分

这个问题的第二部分是:这个数字真的有用吗?我的最终目标是为系统中的每个密码生成一个"分数",我们可以将其用作监视作为动态实体的整体系统安全性.我可能不得不使用另一种算法或两种算法进行字典攻击,更换密码等等 - 但我确实认为熵会在这种"整体"系统评级中发挥重要作用.我欢迎其他方法的建议.

我知道的

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

延期

在发表评论时,我意识到我可以更好地解释这种计算的有用性.当我处理用户密码极弱的遗留系统时,我必须先得到一些具体的证据证明这个弱点,然后才能强制所有用户将密码更改为新的(强制执行的)强密码.通过在系统中存储每个用户帐户的密码强度分数,我可以构建几个不同的度量标准来显示整体系统的弱点,并为更强的密码设置一个案例.

TIA

qua*_*oup 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;
}
Run Code Online (Sandbox Code Playgroud)

count是(键,值)对应的Map (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;
}
Run Code Online (Sandbox Code Playgroud)

编辑3:密码强度比熵更多.熵与不确定性有关; 这不一定转化为更安全.例如:

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

  • 值得一提的是,上述函数返回**[nats](http://en.wikipedia.org/wiki/Nat_(info))**中测量的数据的熵.其他UOM包括**[位](http://en.wikipedia.org/wiki/Bit)**和**[禁令](http://en.wikipedia.org/wiki/Ban_(信息))**.WolframAlpha以位为单位测量熵:例**[1](http://www.wolframalpha.com/input/?i=entropy%28%22hi%22%29)**,**[two](http:/ /www.wolframalpha.com/input/?i=entropy%28%22goodbye%22%29)**和**[three](http://www.wolframalpha.com/input/?i=entropy%28% 22goodbyeod%22%29)**.另见http://codepad.org/OvvRKwQj. (2认同)