我正在做一个代码训练营,我们的目标是建立一个密码生成器,用户可以选择哪种类型的字符(小写,大写,数字和特殊字符)和长度,并为它们提供随机的安全性密码。
除了分配的重要部分外,我能够使所有这些方面都起作用,该部分是生成的密码必须包括用户选择的每个字符。它目前是随机抽取的,因此,如果您选择全部将出现的所有4条条件,则不能总是保证。我该如何验证?
const lowCaseArr = "abcdefghijklmnopqrstuvwxyz";
const upCaseArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const numeralArr = "1234567890";
const specialArr = "!@#$%^&*";
function getLength() {
while (true) {
var userLength = parseInt(prompt("How many numbers, between 8 and 128, would you like to use? (Enter 0 to cancel)"));
if (userLength == 0) {
return 0;
} else if (userLength > 128 || userLength < 8) {
alert("You must enter a number between 8-128.");
} else if (userLength <= 128 && userLength >= 8) {
alert("Great! Your have selected a password with " + userLength + " characters.");
return userLength;
}
}
}
function randChar(passwordCharacters) {
return passwordCharacters.charAt(Math.floor(Math.random() * passwordCharacters.length));
}
function makePassword(userLength, passwordCharacters) {
var securePassword = "";
for (i = 0; i < userLength; i++) {
securePassword += randChar(passwordCharacters);
}
return securePassword;
}
function generatePassword() {
var userLength = getLength();
if (userLength == 0) {
return "User Cancelled Request";
}
var passwordCharacters = "";
var askLowerCase = confirm("Would you like to include lower case characters? (a, b, c)");
if (askLowerCase !== true) {
alert("Got it. No lower case characters will be included.");
} else {
alert("Great! Your password will include lower case characters!");
passwordCharacters += lowCaseArr;
}
var askUpperCase = confirm("Would you like to include upper case characters? (A, B, C)");
if (askUpperCase !== true) {
alert("Got it. No upper case characters will be included.");
} else {
alert("Great! Your password will include upper case characters!");
passwordCharacters += upCaseArr;
}
var askNumerals = confirm("Would you like to include numeral characters? (1, 2, 3)");
if (askNumerals !== true) {
alert("Got it. No numeral characters will be included.");
} else {
alert("Great! Your password will include numeral characters!");
passwordCharacters += numeralArr;
}
var askSpecial = confirm("Would you like to include special characters? (~, !, @)");
if (askSpecial !== true) {
alert("Got it. No special characters will be included.");
} else {
alert("Great! Your password will include special characters!");
passwordCharacters += specialArr;
}
var basePassword = makePassword(userLength, passwordCharacters);
var securePassword = validateOptions(basePassword, askLowerCase, askUpperCase, askNumerals, askSpecial);
return securePassword;
}
var generateBtn = document.querySelector("#generate");
function writePassword() {
var password = generatePassword();
var passwordText = document.querySelector("#password");
passwordText.value = password;
}
generateBtn.addEventListener("click", writePassword);
我的想法是创建一个验证密码的函数,我不确定这里最好的逻辑是什么。
function validateOptions(basePassword, askLowerCase, askUpperCase, askNumerals, askSpecial) {
var securePassword = basePassword;
// while (missing requirements) {
// Validate that all selected characters have been included
// if securePassword does not contain lowercase,
// then replace a random char in string with lowercase character
// if securePassword does not contain uppercase,
// then replace a random char in string with uppercase character
// if securePassword does not contain numbers,
// then replace a random char in string with numeral character
// if securePassword does not contain special characters,
// then replace a random char in string with a special character
// }
return securePassword;
}
答案 0 :(得分:0)
您可以从一开始就通过确保它满足所有约束条件来正确生成密码,而不用更改密码。
我已使用您的代码段来生成一个独立的函数makeSecurePassword()
,该函数接受多个参数:userLength
,askLowerCase
,askUpperCase
,askNumerals
, askSpecial
。它返回所请求的userLength
的密码,仅包含所请求的字符类型。它使用您的randChar()
辅助函数。
var securePassword = makeSecurePassword( 10, true, true, true, true );
console.log(securePassword);
// Return a random character from passwordCharacters:
function randChar(passwordCharacters) {
return passwordCharacters.charAt(Math.floor(Math.random() * passwordCharacters.length));
}
function makeSecurePassword( userLength, askLowerCase, askUpperCase, askNumerals, askSpecial ) {
const lowCaseArr = "abcdefghijklmnopqrstuvwxyz";
const upCaseArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const numeralArr = "1234567890";
const specialArr = "!@#$%^&*";
var password = [];
// Decide which chars to consider:
charArray = [];
if ( askLowerCase ) {
charArray.push( lowCaseArr );
}
if ( askUpperCase ) {
charArray.push( upCaseArr );
}
if ( askNumerals ) {
charArray.push( numeralArr );
}
if ( askSpecial ) {
charArray.push( specialArr );
}
let x = 0; // index into charArray
for ( var i=0; i < userLength; i++ ) {
var a = charArray[x]; // Which array of chars to look at
// Insert at random spot:
password.splice( password.length, 1, randChar( a ) );
// Pick next set of chars:
if ( ++x >= charArray.length ) {
x = 0; // Start with the first set of chars if we went past the end
}
}
return password.join(''); // Create a string from the array of random chars
}