Skip to content

Instantly share code, notes, and snippets.

@Satak
Created July 13, 2020 18:34
Show Gist options
  • Save Satak/a64ee22d9c1139deee7294bbcb2a3e13 to your computer and use it in GitHub Desktop.
Save Satak/a64ee22d9c1139deee7294bbcb2a3e13 to your computer and use it in GitHub Desktop.
Random Password Generator
/**
* 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