Пароли являются наиболее часто используемым механизмом аутентификации. Несмотря на то, что многие сайты переходят на многоэтапную аутентификацию, пароли по-прежнему играют ключевую роль в защите вашей учетной записи. Надежный пароль имеет решающее значение для безопасности учетной записи, и эта статья научит вас, как разработать плагин, который контролирует надежность пароля. Мы собираемся использовать библиотеку zxcvbn и jQuery для создания полнофункционального измерителя надежности пароля для веб-сайтов.
Вступление
Как правило, большинство применений не являются техническими и имеют ограниченные знания о том, как работает аутентификация. Даже для технических пользователей сложно определить, какие пароли являются надежными, а какие легко взломать. Например, простое увеличение длины пароля не обязательно усложняет его взлом.
Измеритель надежности пароля рассчитывает надежность введенного пользователем пароля. Как правило, он отображается в виде уровней силы, таких как очень слабый, слабый, хороший, сильный и т. Д. Счетчик обновляется при каждом вводе пользователем, поэтому расчет должен onkeypress
onkeyup
<script type="text/javascript" >
Когда пользователь пытается создать новую учетную запись, слабые пароли могут быть обнаружены и отклонены, что повышает общую безопасность сайта.
var blackList = ["admin"];
var strength = zxcvbn("password", blackList);
</script>
Расчет надежности пароля
Должны быть четко определены критерии для расчета надежности пароля. Большинство разработчиков склонны использовать критерии проверки вручную для измерителей надежности пароля. Это хорошее руководство для укрепления паролей, но это может быть не самый точный метод, поскольку он не учитывает время, необходимое для взлома пароля. Вместо этого большинство ручных проверок зависит от следующих условий:
- Количество символов
- Использование заглавных букв, цифр и символов.
- Слова в черном списке.
Это нереальная оценка надежности пароля, поскольку некоторые пароли, сгенерированные в ходе этой проверки, будет довольно легко взломать. Поэтому нам нужна точная измерительная система для определения надежности пароля.
zxcvbn
В этом руководстве мы планируем реализовать измеритель надежности пароля с использованием zxcvbn . zxcvbn считается реалистичным измерителем надежности пароля, который использует набор данных общих английских слов, повторяющихся шаблонов, последовательностей и общих английских имен для расчета надежности. Это также позволяет нам занести в черный список некоторые слова при расчете силы. Результат, предоставляемый этой функцией, намного точнее, чем правила расчета прочности вручную. Понимание того, как zxcvbn использует математические функции для расчета прочности, выходит за рамки данного руководства. Те, кто хочет понять логику в zxcvbn, могут посмотреть статью в Dropbox Tech Blog .
Рассмотрим следующий код, который использует функцию zxcvbn. Первый аргумент обязателен для хранения проверяемого пароля. В этом случае пароль — «пароль». Второй аргумент является необязательным и может содержать массив значений для внесения в черный список. Как правило, мы не хотим, чтобы пароль был похож на имя пользователя. Таким образом, мы должны по крайней мере использовать имя пользователя в качестве черного списка для получения надежных паролей.
console.log
Функция zxcvbn возвращает объект, содержащий следующие свойства.
- сила.энтропия — измеряется в битах.
- force.crack_time — это приблизительное время взлома.
- force.crack_time_display — это также используется, чтобы предоставить время взлома удобным для пользователя способом, используя месяцы, годы, столетия и т. д.
- force.score — это фактическая сила, которую мы будем использовать внутри измерителя прочности пароля. Он варьируется от нуля до четырех, где ноль обозначает слабый пароль, а четыре — надежный пароль. Независимо от того, насколько сложен ваш пароль, он не превысит четырех.
- force.match_sequence — предоставляет список шаблонов, используемых для расчета силы. Это объект с несколькими объектами, содержащими шаблоны, такие как перебор, словарь и т. Д. Вы можете проверить это, вызвав
strength
score
- force.calculation_time — это время, затрачиваемое на расчет надежности пароля. Как правило, это будет несколько миллисекунд.
Есть много параметров, которые мы можем использовать для надежности пароля, но мы не хотим слишком много сложностей в проверке пароля. Поэтому, как правило, мы будем использовать только параметр crack_time_display
Если необходимо, мы можем усилить пароли, используя crack_time
score
jquery.password.strength.js
Создание пароля Надежность
Мы собираемся создать измеритель надежности пароля многократного использования, используя jQuery, и будем использовать jQuery Plugin Boilerplate для поддержания стандартной структуры. Счетчик может быть разработан во многих отношениях в соответствии с вашими предпочтениями. Некоторые плагины предоставляют виджет фактического пароля, в то время как некоторые плагины предоставляют сообщение о надежности пароля, так что пользователи могут вставлять его в любом месте. Мы сосредоточимся на последнем, поскольку это добавляет больше гибкости при разработке счетчика паролей. Вот требования к нашему счетчику:
- Нам нужны базовые проверки, такие как проверка пустых значений, равенство пароля и подтверждение значений пароля.
- Нам могут потребоваться специальные проверки, такие как минимальное количество символов, блокировка определенных символов и т. Д.
- Фактическая сила сообщается с использованием предварительно определенных уровней, таких как очень слабый, слабый, средний, сильный и т. Д.
- Мы можем использовать время взлома для реализации прочности в пределах каждого из указанных уровней.
Реализация плагин измеритель силы
Во-первых, нам нужно получить копию jQuery Plugin Boilerplate с GitHub. После загрузки поместите файл в папку вашего проекта и переименуйте его в <html>
Затем загрузите zxcvbn с GitHub. Включите эти файлы в файл проекта, как показано в следующем коде.
<head>
<title>jQuery Password Strength Checker</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript" src="zxcvbn.js"></script>
<script type="text/javascript" src="jquery.password.strength.js"></script>
</head>
<body>
</body>
</html>
jquery.password.strength.js
Теперь откройте файл PasswordStrengthManager
Я предполагаю, что вы знакомы с jQuery Plugin Boilerplate. Сначала мы должны обновить имя плагина и раздел параметров по умолчанию, как показано в следующем коде. Здесь мы изменили имя плагина по умолчанию на minChars
У нас есть две опции для указания значений пароля и подтверждения полей пароля. У нас также есть массив для определения слов в черном списке. Далее у нас есть две опции, называемые maxChars
advancedStrength
var pluginName = "PasswordStrengthManager",
Наконец, у нас есть опция
defaults = {
password: "",
confirm_pass : "",
blackList : [],
minChars : "",
maxChars : "",
advancedStrength : false
};function Plugin(element, options) {
this.element = element;
this.settings = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.init();
this.info = "";
}
init
Далее мы можем перейти в конструктор плагина, как показано в следующем коде. Здесь у нас есть стандартный шаблонный код, кроме информации, которую мы использовали для хранения сообщения, генерируемого измерителем пароля. После того, как плагин используется для любого элемента HTML, будет вызвана эта функция.
init
Функция инициализации плагина используется для инициализации конкретного кода плагина и запуска процесса. Давайте посмотрим на модифицированную функцию this.settings
Сначала мы выполняем обязательные проверки, такие как проверка на наличие пустых паролей и равенство обоих полей паролей. this.info
Сообщение для счетчика паролей хранится в init: function() {
if ("" == this.settings.password || "" == this.settings.confirm_pass) {
this.info = "Password fields cannot be empty";
} else if (this.settings.password != this.settings.confirm_pass) {
this.info = "Passwords doesn't match";
}
$(this.element).html(this.info);
}, Наконец, мы устанавливаем сообщение в элемент счетчика паролей, прошедший инициализацию.
minChars
Далее мы переходим в раздел пользовательских валидаторов. Некоторые сайты предпочитают свои собственные ограничения, такие как диапазон символов для паролей или запрещение определенных символов. Мы собираемся реализовать два валидатора для maxChars
minChars
Мы уже определили maxChars
minChars: function() {
if (this.settings.password.length < this.settings.minChars) {
this.info = "Password should have at least " + this.settings.minChars + " characters";
return false;
} else {
return true;
}
},
maxChars: function() {
if (this.settings.password.length > this.settings.maxChars) {
this.info = "Password should have maximum of " + this.settings.maxChars + " characters";
return false;
} else {
return true;
}
}, Эти функции будут выполняться только в том случае, если мы передадим значение при инициализации. Давайте определим функции для этих валидаторов:
customValidators
Эти две функции проверяют минимальную и максимальную длину символов для данного пароля и возвращают логическое значение. Далее нам нужен способ вызвать эти ручные проверки. Поэтому мы создаем функцию под названием customValidators: function() {
var err = 0;
if (this.settings.minChars != "") {
if (!this.minChars()) {
err++;
}
}
if (this.settings.maxChars != "") {
if (!this.maxChars()) {
err++;
}
}
return err;
}
err
Здесь мы выполняем все пользовательские валидаторы и увеличиваем значение переменной if
Как вы можете видеть, init
Таким образом, если мы не передадим параметры при инициализации, эти валидаторы не будут выполнены. Наконец, вызовите эту функцию в качестве первой строки функции init
Расчет силы zxcvbn
Это последняя часть этого плагина, где мы рассчитываем реальную надежность пароля, используя zxcvbn. Обновите функцию init: function() {
var errors = this.customValidators();
if ("" == this.settings.password || "" == this.settings.confirm_pass) {
this.info = "Password fields cannot be empty";
} else if (this.settings.password != this.settings.confirm_pass) {
this.info = "Passwords doesn't match";
} else if (errors == 0) {
var strength = zxcvbn(this.settings.password, this.settings.blackList);
switch (strength.score) {
case 0:
this.info = "Very Weak";
break;
case 1:
this.info = "Very Weak";
break;
case 2:
this.info = "Weak";
break;
case 3:
this.info = "Medium";
break;
case 4:
if (this.settings.advancedStrength) {
var crackTime = String(strength.crack_time_display);
if (crackTime.indexOf("years") !=-1) {
this.info = "Very Strong";
} else if (crackTime.indexOf("centuries") !=-1) {
this.info = "Perfect";
}
} else {
this.info = "Strong";
}
break;
}
}
$(this.element).html(this.info);
},
switch
Когда пользовательские валидаторы обнаруживают ноль ошибок, мы переходим к реалистичному расчету прочности. Мы можем передать значение пароля и слов из черного списка, определенных в процессе инициализации, функции zxcvbn. Он сгенерирует результат со свойствами, упомянутыми ранее в этой статье.
Мы используем оператор score
Вы можете изменить уровни в соответствии с вашими предпочтениями. Для первых четырех уровней я только что рассмотрел показатель силы. Также мы можем использовать свойство crack_time_display
В этом плагине я использовал его только для оценки силы четыре. Вы можете использовать его и для других целей.
Значение crack_time_display
Итак, мы разбиваем уровень на два подуровня, используя значение crack_time_display
Если пользователь решит не включать расширенную силу, будет использоваться общий уровень, называемый Strong
Не стесняйтесь поиграть с этими свойствами, чтобы создать расширенные счетчики паролей.
Наконец, мы должны изменить последний раздел стандартного кода, как показано ниже, чтобы включить несколько инициализаций, поскольку мы должны выполнять эту функцию для каждого ключевого события.
$.fn[pluginName] = function (options) {
this.each(function() {
$.data(this, "plugin_" + pluginName, new Plugin(this, options));
});
return this;
};
Сейчас мы завершили реализацию плагина. Давайте посмотрим на это в действии, посмотрев на следующий код.
<script type="text/javascript" >
$(function() {
$("#pass").keyup(function() {
initializeStrengthMeter();
});
$("#confirm_pass").keyup(function() {
initializeStrengthMeter();
});
});
function initializeStrengthMeter() {
$("#pass_meter").PasswordStrengthManager({
password: $("#pass").val(),
confirm_pass : $("#confirm_pass").val(),
minChars : "5",
maxChars : "15",
blackList : ["efewf"],
advancedStrength : true
});
}
</script>
Мы используем общую функцию initializeStrengthMeter
Эта функция будет вызываться для элемента, используемого для счетчика паролей. Итак, определите пустой элемент div
id
Здесь у нас есть все атрибуты, определенные в плагине. Вы можете добавлять или удалять их по мере необходимости. Наконец, мы должны вызвать это при событиях keyup
Вывод
В этом руководстве мы выявили недостатки обычного измерителя надежности пароля и использовали zxcvbn для реалистичного расчета надежности. Мы разработали плагин jQuery для обработки общих случаев использования для проверки пароля. Вы можете посмотреть демоверсию этого руководства здесь и загрузить исходный код . Не стесняйтесь расширять плагин с вашими собственными требованиями.