javascript密码生成器

javascript password generator

创建包含a-za-z0-9的8字符随机密码的最佳方法是什么?

绝对没有安全问题,这只是原型设计,我只是想要看起来真实的数据。

我在想一个for (0 to 7) Math.random来产生ASCII码并把它们转换成字符。你还有其他的建议吗?


我可能会用这样的东西:

1
2
3
4
5
6
7
8
9
function generatePassword() {
    var length = 8,
        charset ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
        retVal ="";
    for (var i = 0, n = charset.length; i < length; ++i) {
        retVal += charset.charAt(Math.floor(Math.random() * n));
    }
    return retVal;
}

然后可以将其扩展为通过参数传递长度和字符集。


这是我所知道的最快和最简单的方法:

1
Math.random().toString(36).slice(2)

其思想是将随机数(范围为0..1)强制转换为base36字符串(小写a-z加0-9),并删除前导零和小数点。

请注意,所有伪生成的密码都存在某种形式的漏洞。但是,对于所有正常的用例来说,这已经足够好了。此外,如果不保证此密码,则为理论长度。最多16个字符,最少0个字符。在循环中运行时,其平均长度为100万倍,为15.67个字符,最小长度为5个字符。但是,如果将这些密码中的两个连接在一起,最大长度将为32个字符,平均长度为31.33个字符,最小长度为20个字符。

1
Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2)

我个人使用这个浏览器书签栏中的chrome bookmarklet来快速生成密码:

1
2
3
4
5
6
7
8
javascript:(
    function(){
        prompt('Here is your shiny new password:',
            Math.random().toString(36).slice(2) +
            Math.random().toString(36).slice(2)
        );
    }
)();


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function password_generator( len ) {
    var length = (len)?(len):(10);
    var string ="abcdefghijklmnopqrstuvwxyz"; //to upper
    var numeric = '0123456789';
    var punctuation = '!@#$%^&*()_+~`|}{[]\:;?><,./-=';
    var password ="";
    var character ="";
    var crunch = true;
    while( password.length<length ) {
        entity1 = Math.ceil(string.length * Math.random()*Math.random());
        entity2 = Math.ceil(numeric.length * Math.random()*Math.random());
        entity3 = Math.ceil(punctuation.length * Math.random()*Math.random());
        hold = string.charAt( entity1 );
        hold = (password.length%2==0)?(hold.toUpperCase()):(hold);
        character += hold;
        character += numeric.charAt( entity2 );
        character += punctuation.charAt( entity3 );
        password = character;
    }
    password=password.split('').sort(function(){return 0.5-Math.random()}).join('');
    return password.substr(0,len);
}

console.log( password_generator() );

这将生成一个更健壮的密码,该密码应通过任何密码强度测试。例如:f1&d2?I4(h1&C1^y1)j1@G2#j2{h6%b5@R2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function generatePass(plength){

    var keylistalpha="abcdefghijklmnopqrstuvwxyz";
    var keylistint="123456789";
    var keylistspec="!@#_";
    var temp='';
    var len = plength/2;
    var len = len - 1;
    var lenspec = plength-len-len;

    for (i=0;i<len;i++)
        temp+=keylistalpha.charAt(Math.floor(Math.random()*keylistalpha.length));

    for (i=0;i<lenspec;i++)
        temp+=keylistspec.charAt(Math.floor(Math.random()*keylistspec.length));

    for (i=0;i<len;i++)
        temp+=keylistint.charAt(Math.floor(Math.random()*keylistint.length));

        temp=temp.split('').sort(function(){return 0.5-Math.random()}).join('');

    return temp;
}

这是我生成8字符加密随机密码的函数:

1
2
3
4
5
function generatePassword() {
    var buf = new Uint8Array(6);
    window.crypto.getRandomValues(buf);
    return btoa(String.fromCharCode.apply(null, buf));
}

它的作用是:检索6个加密随机8位整数,并用base64对其进行编码。

由于结果是base64字符集,生成的密码可以由A-ZA-Z0-9+/组成。


如果您有大于等于4.0的lodash,则有一种更优雅的方法可以做到这一点。

1
2
3
4
var chars = 'abcdefghkmnpqrstuvwxyz23456789';
function generatePassword(length) {
  return _.sampleSize(chars, length).join('');
}


秋葵汤的解决方案不起作用。不过,这一个可以:

1
2
3
4
5
6
7
8
9
10
11
function makePasswd() {
  var passwd = '';
  var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  for (i=1;i<8;i++) {
    var c = Math.floor(Math.random()*chars.length + 1);
    passwd += chars.charAt(c)
  }

  return passwd;

}


如果使用字符[\]^_可以,这将产生一个真实的密码。需要Lodash和ES7

1
String.fromCodePoint(...range(8).map(() => Math.floor(Math.random() * 57) + 0x41))

这里没有罗达什

1
String.fromCodePoint(...Array.from({length: 8}, () => Math.floor(Math.random() * 57) + 65))


这里有一个函数为您提供了更多选项来设置特殊字符的最小值、上字符的最小值、下字符的最小值和数字的最小值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function randomPassword(len = 8, minUpper = 0, minLower = 0, minNumber = -1, minSpecial = -1) {
    let chars = String.fromCharCode(...Array(127).keys()).slice(33),//chars
        A2Z = String.fromCharCode(...Array(91).keys()).slice(65),//A-Z
        a2z = String.fromCharCode(...Array(123).keys()).slice(97),//a-z
        zero2nine = String.fromCharCode(...Array(58).keys()).slice(48),//0-9
        specials = chars.replace(/\w/g, '')
    if (minSpecial < 0) chars = zero2nine + A2Z + a2z
    if (minNumber < 0) chars = chars.replace(zero2nine, '')
    let minRequired = minSpecial + minUpper + minLower + minNumber
    let rs = [].concat(
        Array.from({length: minSpecial ? minSpecial : 0}, () => specials[Math.floor(Math.random() * specials.length)]),
        Array.from({length: minUpper ? minUpper : 0}, () => A2Z[Math.floor(Math.random() * A2Z.length)]),
        Array.from({length: minLower ? minLower : 0}, () => a2z[Math.floor(Math.random() * a2z.length)]),
        Array.from({length: minNumber ? minNumber : 0}, () => zero2nine[Math.floor(Math.random() * zero2nine.length)]),
        Array.from({length: Math.max(len, minRequired) - (minRequired ? minRequired : 0)}, () => chars[Math.floor(Math.random() * chars.length)]),
    )
    return rs.sort(() => Math.random() > Math.random()).join('')
}
randomPassword(12, 1, 1, -1, -1)// -> DDYxdVcvIyLgeB
randomPassword(12, 1, 1, 1, -1)// -> KYXTbKf9vpMu0
randomPassword(12, 1, 1, 1, 1)// -> hj|9)V5YKb=7


下面是一个简单的智能代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function generate(l) {
    if (typeof l==='undefined'){var l=8;}
    /* c : alphanumeric character string */
    var c='abcdefghijknopqrstuvwxyzACDEFGHJKLMNPQRSTUVWXYZ12345679',
    n=c.length,
    /* p : special character string */
    p='!@#$+-*&_',
    o=p.length,
    r='',
    n=c.length,
    /* s : determinate the position of the special character */
    s=Math.floor(Math.random() * (p.length-1));

    for(var i=0; i<l; ++i){
        if(s == i){
            /* special charact insertion (random position s) */
            r += p.charAt(Math.floor(Math.random() * o));
        }else{
            /* alphanumeric insertion */
            r += c.charAt(Math.floor(Math.random() * n));
        }
    }
    return r;
}

只需调用generate(),它就可以完成包含一个特殊字符(!@#为安全起见,$+-*&;u)。

可能的结果:wjguk$ey、gav7 ff7、ty_t55dd、ytrqmwvezqyyko_

我的网站上有更多详细信息和示例:https://www.bxnxg.com/minituto-01-generer-mots-de-passes-secures-facilements-en-javascript/


随机为每个字符指定字母、数字、大写和特殊字符,然后验证密码。如果它不包含上述每个字符,则随机将缺少的元素中的一个新字符分配给一个随机的现有字符,然后递归验证,直到形成密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function createPassword(length) {
    var alpha ="abcdefghijklmnopqrstuvwxyz";
    var caps ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var numeric ="0123456789";
    var special ="!$^&*-=+_?";

    var options = [alpha, caps, numeric, special];

    var password ="";
    var passwordArray = Array(length);

    for (i = 0; i < length; i++) {
        var currentOption = options[Math.floor(Math.random() * options.length)];
        var randomChar = currentOption.charAt(Math.floor(Math.random() * currentOption.length));
        password += randomChar;
        passwordArray.push(randomChar);
    }

    checkPassword();

    function checkPassword() {
        var missingValueArray = [];
        var containsAll = true;

        options.forEach(function (e, i, a) {
            var hasValue = false;
            passwordArray.forEach(function (e1, i1, a1) {
                if (e.indexOf(e1) > -1) {
                    hasValue = true;
                }
            });

            if (!hasValue) {
                missingValueArray = a;
                containsAll = false;
            }
        });

        if (!containsAll) {
            passwordArray[Math.floor(Math.random() * passwordArray.length)] = missingValueArray.charAt(Math.floor(Math.random() * missingValueArray.length));
            password ="";
            passwordArray.forEach(function (e, i, a) {
                password += e;
            });
            checkPassword();
        }
    }

    return password;
}


甚至更短:

1
2
3
4
Array.apply(null, Array(8)).map(function() {
    var c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    return c.charAt(Math.random() * c.length);
}).join('');

或作为功能:

1
2
3
4
5
6
function generatePassword(length, charSet) {
    charSet = charSet ? charSet : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^°!"§$%&/()=?`*+~\'#,;.:-_';
    return Array.apply(null, Array(length || 10)).map(function() {
        return charSet.charAt(Math.random() * charSet.length);
    }).join('');
}

这是另一种基于斯蒂芬·霍耶解决方案的方法

1
2
3
4
getRandomString (length) {
  var chars = 'abcdefghkmnpqrstuvwxyz23456789';
  return times(length, () => sample(chars)).join('');
}


这里有一个自由的,可配置的javascript类,生成随机密码:javascript随机密码生成器。

示例

密码由小写+大写+数字组成,长8个字符:

1
2
var randomPassword = new RandomPassword();
document.write(randomPassword.create());

密码由小写+大写+数字组成,长20个字符:

1
2
var randomPassword = new RandomPassword();
document.write(randomPassword.create(20));

密码由小写+大写+数字+符号组成,长20个字符:

1
2
var randomPassword = new RandomPassword();
document.write(randomPassword.create(20,randomPassword.chrLower+randomPassword.chrUpper+randomPassword.chrNumbers+randomPassword.chrSymbols));


1
2
3
4
5
6
7
8
var createPassword = function() {
  var passAt = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  var passArray = Array.from({length: 15})

  return passArray.map(function(_, index) {
    return index % 4 == 3 ? '-' : passAt.charAt(Math.random() * passAt.length)
  }).join('')
}

结果如下:

1
2
3
4
L5X-La0-bN0-UQO
9eW-svG-OdS-8Xf
ick-u73-2s0-TMX
5ri-PRP-MNO-Z1j


1
2
3
4
5
6
function genPass(n)    // e.g. pass(10) return 'unQ0S2j9FY'
{
    let c='abcdefghijklmnopqrstuvwxyz'; c+=c.toUpperCase()+1234567890;

    return [...Array(n)].map(b=>c[~~(Math.random()*62)]).join('')
}

其中n为输出密码字符数;62c.length,其中~~4.5 = 4为替换Math.floor的诀窍。

备选方案

1
2
3
4
5
6
function genPass(n)     // e.g. pass(10) return 'unQ0S2j9FY'
{
    let c='abcdefghijklmnopqrstuvwxyz'; c+=c.toUpperCase()+1234567890;

    return '-'.repeat(n).replace(/./g,b=>c[~~(Math.random()*62)])
}

要扩展字符列表,请将其添加到c中,例如添加10个字符!$^&*-=+_?写入c+=c.toUpperCase()+1234567890+'!$^&*-=+_?'并将Math.random()*62更改为Math.random()*72(添加10到62)。


下面是我发现的一个解决方案,如果您查看页面的源代码,您可以看到它们如何实现它们的示例:

https://www.404it.no/en/blog/javascript_random_password_生成器

javascript随机密码生成器出版日期:2015年1月6日更新日期:2015年1月18日作者:Per Kristian Haakonsen