Помощь в вычислении (и полезности) энтропии паролей
Это вопрос из двух частей:
Часть 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 из одного пароля, а как элемент в списке общих паролей. Если пароль очень похож на другие пароли, то его энтропия будет низкой по сравнению с другими паролями. Если его уникальность будет выше.