(function ($) {
var LOWER = /[a-z]/,
UPPER = /[A-Z]/,
DIGIT = /[0-9]/,
DIGITS = /[0-9].*[0-9]/,
SPECIAL = /[^a-zA-Z0-9]/,
SAME = /^(.)\1+$/;
function rating(rate, message) {
return {
rate: rate,
messageKey: message
};
}
function uncapitalize(str) {
return str.substring(0, 1).toLowerCase() + str.substring(1);
}
$.validator.passwordRating = function (password, username) {
if (!password || password.length < 5) return rating(0, "too-short");
if (username && password.toLowerCase().match(username.toLowerCase())) return rating(0, "similar-to-username");
if (SAME.test(password)) return rating(1, "very-weak");
var lower = LOWER.test(password),
upper = UPPER.test(uncapitalize(password)),
digit = DIGIT.test(password),
digits = DIGITS.test(password),
special = SPECIAL.test(password);
if (lower && upper && digit && digits && special && password.length > 19 ||
lower && upper && special && digit && digits && password.length > 19 ||
lower && special && upper && digit && digits && password.length > 19 ||
lower && special && digit && digits && upper && password.length > 19 ||
lower && digit && digits && special && upper && password.length > 19 ||
lower && digit && digits && upper && special && password.length > 19 ||
upper && lower && digit && digits && special && password.length > 19 ||
upper && lower && special && digit && digits && password.length > 19 ||
upper && special && lower && digit && digits && password.length > 19 ||
upper && special && digit && digits && lower && password.length > 19 ||
upper && digit && digits && special && lower && password.length > 19 ||
upper && digit && digits && lower && special && password.length > 19 ||
digit && digits && lower && upper && special && password.length > 19 ||
digit && digits && lower && special && upper && password.length > 19 ||
digit && digits && special && lower && upper && password.length > 19 ||
digit && digits && special && upper && lower && password.length > 19 ||
digit && digits && upper && special && lower && password.length > 19 ||
digit && digits && upper && lower && special && password.length > 19 ||
special && lower && upper && digit && digits && password.length > 19 ||
special && lower && digit && digits && upper && password.length > 19 ||
special && digit && digits && lower && upper && password.length > 19 ||
special && digit && digits && upper && lower && password.length > 19 ||
special && upper && digit && digits && lower && password.length > 19 ||
special && upper && lower && digit && digits && password.length > 19 ||
upper && lower && digit && special && password.length > 19 ) {
return rating(5, "very-strong");
}
if (lower && upper && digit && digits && special && password.length > 8 ||
lower && upper && special && digit && digits && password.length > 8 ||
lower && special && upper && digit && digits && password.length > 8 ||
lower && special && digits && digit && upper && password.length > 8 ||
lower && digit && digits && special && upper && password.length > 8 ||
lower && digit && digits && upper && special && password.length > 8 ||
upper && lower && digit && digits && special && password.length > 8 ||
upper && lower && special && digit && digits && password.length > 8 ||
upper && special && lower && digit && digits && password.length > 8 ||
upper && special && digit && digits && lower && password.length > 8 ||
upper && digit && digits && special && lower && password.length > 8 ||
upper && digit && digits && lower && special && password.length > 8 ||
digit && digits && lower && upper && special && password.length > 8 ||
digit && digits && lower && special && upper && password.length > 8 ||
digit && digits && special && lower && upper && password.length > 8 ||
digit && digits && special && upper && lower && password.length > 8 ||
digit && digits && upper && special && lower && password.length > 8 ||
digit && digits && upper && lower && special && password.length > 8 ||
special && lower && upper && digit && digits && password.length > 8 ||
special && lower && digit && digits && upper && password.length > 8 ||
special && digit && digits && lower && upper && password.length > 8 ||
special && digit && digits && upper && lower && password.length > 8 ||
special && upper && digit && digits && lower && password.length > 8 ||
special && upper && lower && digit && digits && password.length > 8 ||
special && lower && upper && digit && digits && password.length > 8 ||
special && lower && digit && digits && upper && password.length > 8 ||
special && digit && digits && lower && upper && password.length > 8 ||
special && digit && digits && upper && lower && password.length > 8 ||
special && upper && digit && digits && lower && password.length > 8 ||
special && upper && lower && digit && digits && password.length > 8 ||
upper && lower && digit && special && password.length > 8) {
return rating(4, "strong");
}
if (lower && upper && digit && digits && password.length > 5 ||
lower && upper && digit && digits && password.length > 5 ||
lower && upper && digit && digits && password.length > 5 ||
lower && digit && digits && upper && password.length > 5 ||
lower && digit && digits && upper && password.length > 5 ||
lower && digit && digits && upper && password.length > 5 ||
upper && lower && digit && digits && password.length > 5 ||
upper && lower && digit && digits && password.length > 5 ||
upper && lower && digit && digits && password.length > 5 ||
upper && digit && digits && lower && password.length > 5 ||
upper && digit && digits && lower && password.length > 5 ||
upper && digit && digits && lower && password.length > 5 ||
digit && digits && lower && upper && password.length > 5 ||
digit && digits && lower && upper && password.length > 5 ||
digit && digits && lower && upper && password.length > 5 ||
digit && digits && upper && lower && password.length > 5 ||
digit && digits && upper && lower && password.length > 5 ||
digit && digits && upper && lower && password.length > 5 ||
lower && upper && digit && digits && password.length > 5 ||
lower && digit && digits && upper && password.length > 5 ||
digit && digits && lower && upper && password.length > 5 ||
digit && digits && upper && lower && password.length > 5 ||
upper && digit && digits && lower && password.length > 5 ||
upper && lower && digit && digits && password.length > 5 ||
lower && upper && digit && digits && password.length > 5 ||
lower && digit && digits && upper && password.length > 5 ||
digit && digits && lower && upper && password.length > 5 ||
digit && digits && upper && lower && password.length > 5 ||
digit && upper && lower && password.length < 8 ||
digit && lower && upper && password.length < 8 ||
digits && upper && lower && password.length < 8 ||
digits && lower && upper && password.length < 8 ||
upper && digit && digits && lower && password.length < 8 ||
upper && lower && digit && digits && password.length < 8 ||
upper && lower && digit && special && password.length < 8) {
return rating(3, "good");
}
return rating(2, "weak");
}
$.validator.passwordRating.messages = {
"similar-to-username": "Too similar to username",
"too-short": "Too short",
"very-weak": "Very weak",
"weak": "Weak",
"good": "Good",
"strong": "Strong",
"very-strong": "Very Strong"
}
$.validator.addMethod("password", function (value, element, usernameField) {
// use untrimmed value
var password = element.value,
// get username for comparison, if specified
username = $(typeof usernameField != "boolean" ? usernameField : []);
var rating = $.validator.passwordRating(password, username.val());
// update message for this field
var meter = $(".password-meter", element.form);
meter.find(".password-meter-bar").removeClass().addClass("password-meter-bar").addClass("password-meter-" + rating.messageKey);
meter.find(".password-meter-message").removeClass().addClass("password-meter-message").addClass("password-meter-message-" + rating.messageKey).text($.validator.passwordRating.messages[rating.messageKey]);
// display process bar instead of error message
return rating.rate > 2;
}, " ");
// manually add class rule, to make username param optional
$.validator.classRuleSettings.password = {
password: true
};
})(jQuery);
答案 0 :(得分:1)
我会做类似的事情:
special = SPECIAL.test(password) ? 1 : 0;
digits = DIGITS.test(password) ? 1 : 0;
...
length = password.length > 19 ? 2 : (password.length > 8 ? 1 : 0);
strength = special + digits + ... + length;
答案 1 :(得分:0)
使用简单的JavaScript函数
可以完成另一种方法 checkStrength(password) {
var numbers = "0123456789";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var punctuation = "!.@$£#*()%~<>{}[]?\\\"+-";
var strength = 0;
var fNumber = false;
var fLower = false;
var fUpper = false;
var fPanctuation = false;
var progressBar = document.getElementById("passIndicator");
var progState = document.getElementById("progState");
progressBar.className = "pwd_strength";
if (contains(password, numbers) > 0) {
var fNumber = true;
}
if (contains(password, lowercase) > 0) {
var fLower = true;
}
if (contains(password, uppercase) > 0) {
var fUpper = true;
}
if (contains(password, punctuation) > 0) {
var fPanctuation = true;
}
if (fNumber == true && (fLower == true || fUpper == true)) {
strength += 1;
progState.className = "pwd_strength_1";
if (fNumber == true && fLower == true && fUpper == true) {
strength += 1;
progState.className = "pwd_strength_2";
if (password.length >=8) {
strength += 1;
progState.className = "pwd_strength_3";
if (fPanctuation == true) {
strength += 1;
progState.className = "pwd_strength_4";
if (password.length >=10) {
strength += 1;
progState.className = "pwd_strength_5";
}
}
}
}
}else {
progState.className = "pwd_strength_0";
}
}
function contains(password, validChars) {
count = 0;
for (i = 0; i < password.length; i++) {
var char = password.charAt(i);
if (validChars.indexOf(char) > -1) {
count++;
}
}
return count;
}`