javascript password generator
创建包含
绝对没有安全问题,这只是原型设计,我只是想要看起来真实的数据。
我在想一个
我可能会用这样的东西:
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
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() ); |
。
这将生成一个更健壮的密码,该密码应通过任何密码强度测试。例如:
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字符集,生成的密码可以由
如果您有大于等于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; } |
号
如果使用字符
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('') } |
号
其中
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)]) } |
号
要扩展字符列表,请将其添加到
下面是我发现的一个解决方案,如果您查看页面的源代码,您可以看到它们如何实现它们的示例:
https://www.404it.no/en/blog/javascript_random_password_生成器
javascript随机密码生成器出版日期:2015年1月6日更新日期:2015年1月18日作者:Per Kristian Haakonsen