Created
July 13, 2020 18:34
-
-
Save Satak/a64ee22d9c1139deee7294bbcb2a3e13 to your computer and use it in GitHub Desktop.
Random Password Generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Generate string from ascii range | |
* @param {any} ranges - ASCII code | |
* @param {number} charsCount | |
* @param {string[]} allCharsTotal | |
* @return {string} | |
*/ | |
function generateChars(ranges, charsCount, allCharsTotal) { | |
var allChars = []; | |
var i; | |
ranges.map(function (range) { | |
for (i = range.min; i <= range.max; i++) { | |
allChars.push(String.fromCharCode(i).toString()); | |
allCharsTotal.push(String.fromCharCode(i).toString()); | |
} | |
}); | |
return allChars | |
.sort(function () { | |
return Math.random() - Math.random(); | |
}) | |
.slice(0, charsCount) | |
.join(''); | |
} | |
/** | |
* Shuffle string | |
* @param {string} str | |
* @return {string} | |
*/ | |
function shuffle(str) { | |
var parts = str.split(''); | |
var random; | |
var temp; | |
var i; | |
for (i = parts.length; i > 0; ) { | |
random = parseInt(Math.random() * i, 10); | |
temp = parts[--i]; | |
parts[i] = parts[random]; | |
parts[random] = temp; | |
} | |
return parts.join(''); | |
} | |
/** | |
* Generate a random password string. All parameters are optional. By default it generates 20 character long string from the ASCII table | |
* @param {number} [fixedLength] - Set password length. Default is 20 characters if parameter is not used. | |
* @param {number} [minLength] - For random size password, min size. Good to set at least 20 | |
* @param {number} [maxLength] - For random size password, max size. Good to set some where between 20 and 123 | |
* @param {boolean | string | number} [noSpecial] - Set truthie to disable special characters in password | |
* @param {boolean | string | number} [noNumber] - Set truthie to disable numbers in password | |
* @param {boolean | string | number} [noUpper] - Set truthie to disable capital letters in password | |
* @param {boolean | string | number} [noLower] - Set truthie to disable lowercase letters in password | |
* @return {string} - password | |
*/ | |
function passwordGenerator( | |
fixedLength, | |
minLength, | |
maxLength, | |
noSpecial, | |
noNumber, | |
noUpper, | |
noLower | |
) { | |
var allCharsTotal = []; | |
var pwLength = | |
fixedLength || Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength || 20; | |
var types = [ | |
{ type: 'lower', enabled: !noLower, ranges: [{ min: 97, max: 122 }] }, | |
{ type: 'upper', enabled: !noUpper, ranges: [{ min: 65, max: 90 }] }, | |
{ type: 'number', enabled: !noNumber, ranges: [{ min: 48, max: 57 }] }, | |
{ | |
type: 'special', | |
enabled: !noSpecial, | |
ranges: [ | |
{ min: 33, max: 47 }, | |
{ min: 58, max: 64 }, | |
{ min: 91, max: 96 }, | |
{ min: 123, max: 126 }, | |
], | |
}, | |
]; | |
var enabledTypes = types.filter(function (obj) { | |
return obj.enabled; | |
}); | |
var charsCount = Math.floor(pwLength / enabledTypes.length); | |
var charStr = enabledTypes | |
.map(function (i) { | |
return generateChars(i.ranges, charsCount, allCharsTotal); | |
}) | |
.join(''); | |
// if password is not long enough, add extra characters | |
while (charStr.length !== pwLength) { | |
charStr += allCharsTotal | |
.join('') | |
.charAt(Math.floor(Math.random() * allCharsTotal.join('').length)); | |
} | |
return shuffle(charStr); | |
} | |
var pw = passwordGenerator(0, 20, 123); | |
console.log(pw); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment