Это - два вопроса о части:
Часть 1
Во-первых, имея дело с вычислением энтропии пароля в PHP. Я не мог найти любые примеры кода, которые являются опытным путем звуковыми и действительно хотели бы некоторую справку в нахождении 'правильного' способа вычислить заключительное число. У большого количества людей в сети есть их собственный домашней выпечки алгоритм взвешивания, но я действительно ищу научный ответ на уравнение.
Я буду использовать энтропию пароля как всего одна часть большей системы безопасности и как способ проанализировать нашу полную безопасность данных на основе информации, доступной, если пароль пользователя будет поставлен под угрозу и как легко пароль может быть поврежден грубой силой.
Часть 2
Вторая часть этого вопроса: как полезное желание это число действительно быть? Моя конечная цель должна генерировать 'счет' к каждому паролю в системе, которую мы можем использовать для контроля нашей полной безопасности системы как динамического объекта. Я должен буду, вероятно, работать в другом алгоритме или два для атак с подбором по словарю, l33t заменяющие пароли, и т.д. - но я действительно чувствую, что энтропия будет играть важную роль в такой 'полной' системной оценке. Я действительно приветствую предложения для других подходов все же.
Что я знаю
Я видел, что некоторое упоминание о логарифмических уравнениях для вычисления сказало, что энтропия, но я должен все же видеть хороший пример, который на самом деле не записан как математическое уравнение. Я мог действительно использовать пример кода (даже если не строго в PHP) для получения меня движение.
Расширение
В создании комментария я понял, что могу лучше объяснить полноценность этого вычисления. Когда я работаю над унаследованными системами, где у пользователей есть чрезвычайно слабые пароли, у меня должно быть некоторое конкретное доказательство той слабости, прежде чем я смогу изложить доводы для того, чтобы вынуждать всех пользователей изменить их пароли на новый (вынужденный) сильный пароль. Путем хранения надежности пароля выигрывают за каждую учетную запись пользователя в системе, которую я могу создать несколько различных метрик, чтобы показать полной системной слабости и изложить доводы для более сильных паролей.
TIA
Энтропия строки имеет формальное определение, указанное здесь: 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
- это Map, где (key, value) соответствует (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) Не использовать пароль повторно.