在javascript中生成具有要求的随机密码字符串

2022-08-30 04:27:00

我想生成一个随机字符串,该字符串必须包含a-z中的5个字母和3个数字。

我如何使用JavaScript做到这一点?

我有以下脚本,但它不符合我的要求。

        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        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);
        }

答案 1

强制固定数量的字符是一个主意。它不会提高密码的质量。更糟糕的是,它减少了可能的密码数量,因此通过暴力破解进行黑客攻击变得更加容易。

要生成由字母数字字符组成的随机单词,请使用:

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.toStringstring.prototype.slice 方法的文档。


答案 2

一种更易于维护和安全的方法。

更新以扩展我的意思以及它是如何工作的。

  1. 安全。MDN非常明确地将Math.random用于与安全性相关的任何事情

    Math.random() 不提供加密安全的随机数。不要将它们用于与安全性相关的任何事情。请改用 Web Crypto API,更准确地说是 window.crypto.getRandomValues() 方法。

    看看2020年getRandomValues的can-i-use,你可能不再需要和回退,除非你关心古老的浏览器。msCryptoMath.random

  2. 可维护主要是作为定义密码中允许的字符类的简单方法。但是,关于每个都完成其工作的3件事:定义一个模式,尽可能安全地获取随机字节,提供一个公共API来组合两者。RegExp_pattern

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)'>