用javascript生成随机密码string
我想要生成一个随机string,必须有从az和3个数字5个字母。
我怎样才能做到这一点与JavaScript?
我有以下脚本,但不符合我的要求。
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; var string_length = 8; var randomstring = ''; for (var i=0; i<string_length; i++) { var rnum = Math.floor(Math.random() * chars.length); randomstring += chars.substring(rnum,rnum+1); }
强制固定数量的字符是一个坏主意。 它不会提高密码的质量。 更糟糕的是,它减less了可能的密码数量,所以通过暴力破解的黑客攻击变得更容易。
要生成由字母数字字符组成的随机单词,请使用:
var randomstring = Math.random().toString(36).slice(-8);
它是如何工作的?
Math.random() // Generate random number, eg: 0.123456 .toString(36) // Convert to base-36 : "0.4fzyo82mvyr" .slice(-8);// Cut off last 8 characters : "yo82mvyr"
Number.prototype.toString
和string.prototype.slice
方法的文档。
多一点可维护和安全的方法。
var Password = { _pattern : /[a-zA-Z0-9_\-\+\.]/, _getRandomByte : function() { // http://caniuse.com/#feat=getrandomvalues if(window.crypto && window.crypto.getRandomValues) { var result = new Uint8Array(1); window.crypto.getRandomValues(result); return result[0]; } else if(window.msCrypto && window.msCrypto.getRandomValues) { var result = new Uint8Array(1); window.msCrypto.getRandomValues(result); return result[0]; } else { return Math.floor(Math.random() * 256); } }, generate : function(length) { return Array.apply(null, {'length': length}) .map(function() { var result; while(true) { result = String.fromCharCode(this._getRandomByte()); if(this._pattern.test(result)) { return result; } } }, this) .join(''); } };
<input type='text' id='p'/><br/> <input type='button' value ='generate' onclick='document.getElementById("p").value = Password.generate(16)'>
这不是完全优化,但它应该工作。
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; var string_length = 8; var randomstring = ''; var charCount = 0; var numCount = 0; for (var i=0; i<string_length; i++) { // If random bit is 0, there are less than 3 digits already saved, and there are not already 5 characters saved, generate a numeric value. if((Math.floor(Math.random() * 2) == 0) && numCount < 3 || charCount >= 5) { var rnum = Math.floor(Math.random() * 10); randomstring += rnum; numCount += 1; } else { // If any of the above criteria fail, go ahead and generate an alpha character from the chars string var rnum = Math.floor(Math.random() * chars.length); randomstring += chars.substring(rnum,rnum+1); charCount += 1; } } alert(randomstring);
在一个例子中说明一个例子来说明。
这里有一个jsfiddle供你testing: http : //jsfiddle.net/sJGW4/3/
我已经写了一个从你的答案启发小的一个:
(function(){g=function(){c='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';p='';for(i=0;i<8;i++){p+=c.charAt(Math.floor(Math.random()*62));}return p;};p=g();while(!/[AZ]/.test(p)||!/[0-9]/.test(p)||!/[az]/.test(p)){p=g();}return p;})()
这个函数返回密码并且可以在小书签中使用,如:
javascript:alert(TheCodeOfTheFunction);
许多答案(包括这一个的原始答案)没有解决OP的字母和数量要求。 下面是两个解决scheme:一般(不分钟字母/数字),并与规则。
一般:
我相信这是比以上更好的通用解决scheme,因为:
- 它比接受的/最高票数的答案更安全,也更通用,因为它支持以区分大小写的方式设置任何字符
- 它比其他答案更简洁(一般解决scheme,最多3行;可以是单行)
- 它只使用本地的Javascript-不需要安装或其他库
注意
- 为了在IE上工作,Array.fill()原型必须被填充
- 如果可用,最好使用window.crypto.getRandomValues()而不是Math.random()(感谢@BenjaminH指出)
三内胆:
var pwdChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var pwdLen = 10; var randPassword = Array(pwdLen).fill(pwdChars).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');
或者,作为一线:
var randPassword = Array(10).fill("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');
信/号码规则
现在,在上面的变化。 这将从给定的字符集(字母,数字)生成三个随机string,然后对结果进行加扰。
请注意下面的使用sort()仅用于说明目的。 对于生产用途,请使用诸如Durstenfeld之类的随机播放函数replace下面的sort()函数。
首先,作为一个function:
function randPassword(letters, numbers, either) { var chars = [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", // letters "0123456789", // numbers "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" // either ]; return [letters, numbers, either].map(function(len, i) { return Array(len).fill(chars[i]).map(function(x) { return x[Math.floor(Math.random() * x.length)]; }).join(''); }).concat().join('').split('').sort(function(){ return 0.5-Math.random(); }).join('') } // invoke like so: randPassword(5,3,2);
同样的事情,作为一个2 – class轮(不可否认,非常漫长和丑陋的线 – 如果你使用适当的洗牌function不会是一个class轮,不build议,但有时它是有趣的):
var chars = ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz","0123456789", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"]; var randPwd = [5,3,2].map(function(len, i) { return Array(len).fill(chars[i]).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('') }).concat().join('').split('').sort(function(){return 0.5-Math.random()}).join('');
var letters = ['a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; var numbers = [0,1,2,3,4,5,6,7,8,9]; var randomstring = ''; for(var i=0;i<5;i++){ var rlet = Math.floor(Math.random()*letters.length); randomstring += letters[rlet]; } for(var i=0;i<3;i++){ var rnum = Math.floor(Math.random()*numbers.length); randomstring += numbers[rnum]; } alert(randomstring);
我不会build议使用强制密码,因为它限制了用户的安全性,但是有任何方法,
传统的JavaScript方法 –
Math.random().toString(36).slice(-8);
使用随机string
安装随机string:
npm install randomstring
在App.js中使用它 –
var randStr = require('randomstring'); var yourString = randStr.generate(8);
您的密码的价值正在举行variablesyourString
。
不要使用强制密码!
强制密码可能会损害您的安全性,因为所有的密码都在相同的字符集之下,这可能很容易被破坏!
如果您需要使用至less一个数字,一个大写字母和一个小写字符生成一个密码:
function generatePassword(passwordLength) { var numberChars = "0123456789"; var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var lowerChars = "abcdefghijklmnopqrstuvwxyz"; var allChars = numberChars + upperChars + lowerChars; var randPasswordArray = Array(passwordLength); randPasswordArray[0] = numberChars; randPasswordArray[1] = upperChars; randPasswordArray[2] = lowerChars; randPasswordArray = randPasswordArray.fill(allChars, 3); return shuffleArray(randPasswordArray.map(function(x) { return x[Math.floor(Math.random() * x.length)] })).join(''); } function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } alert(generatePassword(12));
这是小提琴,如果你想玩/testing: http : //jsfiddle.net/sJGW4/155/
道具给@mwag给我开始创build这个。
最后,不使用浮点黑客:
function genpasswd(n) { // 36 ** 11 > Number.MAX_SAFE_INTEGER if (n > 10) throw new Error('Too big n for this function'); var x = "0000000000" + Math.floor(Number.MAX_SAFE_INTEGER * Math.random()).toString(36); return x.slice(-n); }
正如@RobW所指出的那样,将密码限制在OPscheme中提出的固定数量的字符是一个坏主意 。 但更糟糕的是,提出基于Math.random
代码的答案,是一个非常糟糕的主意 。
让我们从坏主意开始吧。 操作码是从一组62中随机select一个8个字符的string。将随机string限制为5个字母和3个数字表示结果密码的熵最多为 28.5位(而不是47.6位的电位如果删除了5个字母和3个数字的分配限制)。 这不是很好。 但事实上情况更糟。 代码的最好方面是通过使用Math.random
作为生成密码的熵的手段来销毁的。 Math.random
是一个伪随机数发生器 。 由于伪随机数发生器的确定性,所产生的密码的熵是非常糟糕的 ,所以提出任何这样的提议的解决scheme是一个非常糟糕的主意 。 假设这些密码被分发给最终用户(o / w有什么意义),那么接收这样一个密码的主动攻击者很有可能预测将来的密码泄漏给其他用户,这可能不是一件好事。
但是回到一个糟糕的主意 。 假设使用密码强的伪随机数发生器代替Math.random
。 你为什么要把密码限制在28.5位? 如上所述,这不是很好。 推测5个字母,3个数字的scheme是协助用户随机pipe理密码pipe理。 但是让我们面对现实吧,你必须平衡使用的易用性和使用的 价值 ,28.5比特的熵对防守活跃的对手来说没有什么价值。
但足够的坏。 让我们提出一条前进的道路。 我将使用JavaScript EntropyString库,它可以“从不同的字符集中高效地生成指定熵的密码强的随机string”。 我将使用一个32个字符的字符集来减less容易混淆的字符的使用或者形成英文单词。 而不是5个字母,3个数字scheme(它的熵太less),我会宣布密码将有60位熵(这是平衡与价值的平衡)。
import {Random, charSet32} from 'entropy-string' const random = new Random(charSet32) const string = random.string(60)
“Q7LfR8Jn7RDp”
注意random.string
的参数是所需的熵位,而不是随机string生成的更常见的解决scheme,它指定了传递的string长度(这是错误的,通常是不明确的,但这是另一个故事)。
有一个随机的密码string发生器与选定的长度
let input = document.querySelector("textarea"); let button = document.querySelector("button"); let length = document.querySelector("input"); function generatePassword(n) { let pwd = ""; while(!pwd || pwd.length < n) { pwd += Math.random().toString(36).slice(-22); } return pwd.substring(0, n); } button.addEventListener("click", function() { input.value = generatePassword(length.value); });
<div>password:</div> <div><textarea cols="70" rows="10"></textarea></div> <div>length:</div> <div><input type="number" value="200"></div> <br> <button>gen</button>