Помощь в вычислении (и полезности) энтропии паролей

Это вопрос из двух частей:

Часть 1

Сначала рассмотрим вычисление энтропии пароля в PHP. Я не смог найти примеры кода, которые являются эмпирически обоснованными, и мне очень понравилась бы помощь в поиске "правильного" способа вычисления конечного числа. У многих людей в сети есть свой собственный домашний алгоритм взвешивания, но я действительно ищу научный ответ на уравнение.

Я буду использовать энтропию паролей как одну часть более крупной системы безопасности и как способ анализа нашей общей безопасности данных на основе информации, доступной, если скомпрометирован пароль пользователя и насколько легко пароль может быть разбит грубой силой.

Часть 2

Вторая часть этого вопроса: насколько полезной будет эта цифра? Моя конечная цель - создать "оценку" для каждого пароля в системе, который мы можем использовать для мониторинга нашей общей безопасности системы как динамического объекта. Мне, вероятно, придется работать в другом алгоритме или два для словарных атак, заменяющих паролей l33t и т.д., Но я чувствую, что энтропия будет играть важную роль в таком "общем" рейтинге системы. Однако я приветствую предложения по другим подходам.

Что я знаю

Я видел некоторое упоминание логарифмических уравнений для вычисления энтропии, но мне еще предстоит увидеть хороший пример, который на самом деле не написан как математическое уравнение. Я мог бы действительно использовать пример кода (даже если не строго в PHP), чтобы заставить меня двигаться.

Extension

Сделав комментарий, я понял, что могу лучше объяснить полезность этого расчета. Когда я работаю над устаревшими системами, в которых пользователи имеют очень слабые пароли, у меня должно быть какое-то конкретное доказательство этой слабости, прежде чем я смогу сделать так, чтобы заставить всех пользователей менять свои пароли на новый (принудительный) надежный пароль. Сохраняя показатель силы пароля для каждой учетной записи пользователя в системе, я могу создать несколько разных показателей, чтобы показать общую слабость системы и сделать пример для более сильных паролей.

ТИА

Ответы

Ответ 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). Это, очевидно, означает, что вам нужно обработать строку до вызова этого метода.

EDIT 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: Там намного больше силы пароля, чем энтропия. Энтропия - это неопределенность; что не обязательно приводит к большей безопасности. Например:

Энтропия "[email protected]!0aj" равна 2,5, а энтропия "password" равна 2,75

Ответ 2

Принуждение определенного уровня энтропии является требованием CWE-521.

(1) Минимальная и максимальная длина,
(2) Требовать смешанные наборы символов (альфа, числовые, специальные, смешанные случаи); (3) Не содержать имя пользователя; (4) Истечение срока действия,
(5) Повторное использование пароля не используется.

Ответ 3

Чтобы использовать энтропию, вам нужно не просто получить Shannon Entropy из одного пароля, а как элемент в списке общих паролей. Если пароль очень похож на другие пароли, то его энтропия будет низкой по сравнению с другими паролями. Если его уникальность будет выше.