Помогите с расчетом (и полезностью) парольной энтропии - PullRequest
15 голосов
/ 07 июля 2010

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

Часть 1

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

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

Часть 2

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

Что я знаю

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

Extension

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

ТИА

Ответы [ 3 ]

12 голосов
/ 07 июля 2010

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

Энтропия "akj@!0aj" равна 2,5, а энтропия "password" равна 2,75

1 голос
/ 08 июля 2010

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

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

0 голосов
/ 04 октября 2014

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

...