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

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

Часть 1

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

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

Часть 2

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

Я Знаю

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

расширение

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

ТИА

3 ответов


энтропия строки имеет формальное определение, указанное здесь: 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;
}

EDIT 3: Сила пароля намного больше, чем энтропия. Энтропия - это неопределенность; что не обязательно означает большую безопасность. Например:

энтропия "akj@!0aj" - в 2,5, в то время как энтропия "password" в 2.75


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

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


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