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