【问题标题】:Generate random password based on user input in Javascript根据 Javascript 中的用户输入生成随机密码
【发布时间】:2020-04-17 15:26:19
【问题描述】:

任务是提示用户输入密码长度和字符类型,然后生成一个随机密码。我认为 for 循环无法正常工作。 retVal 返回为空,因为 for 循环没有传递任何东西。我尝试删除 charAt 函数并让 Math.floor 给我公正和索引,这只是给了我 undefinedundefinedundefinedundefinedundefinedundefined。回到常规的 charAt 函数,我什么也没得到。

//ask for length
var length = prompt("How many characters will your password be? Enter a number between 8 and 128");

//ask for character type
var charType = prompt("Enter a character type: special, numeric, uppercase, lowercase.");

//generate password
function generatePassword() {
  //evaluate character type
  var charSet = "";
  if( charType.toLowerCase === "lowercase" ) {
    charSet = "abcdefghijklmnopqrstuvwxyz";
  } else if( charType.toLowerCase === "uppercase" ) {
    charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  } else if( charType.toLowerCase === "numeric" ) {
    charSet = "0123456789";
  } else if( charType.toLowerCase === "special" ) {
    charSet = " !\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
  } 
  //return value
  var retVal = "";
  //for (var i = 0, n = charSet.length; i < length; i++) {
    for (var i = 0, n = length; i < length; i++) {
    //picks a character within charSet at index of random number
    retVal += charSet.charAt(Math.floor(Math.random() * n));
  }
  console.log(retVal);
  return retVal;
}

【问题讨论】:

  • 是否还有一种方法可以获取符合多个条件的答案并生成密码?比如有大写字母和特殊字符的?
  • 好吧,如果你有多个字符串,比如 "abc","ABC","1@3$" 你可以做类似 password=abc[2]+ABC[1]+123[ 2] 。这只是一个例子。您可以使用 Math.random 随机化它作为索引。

标签: javascript string random return


【解决方案1】:

您遇到了一些微妙的问题。

  • prompt 返回一个字符串,您需要将其转换为一个数字以用于您的长度 (Number(prompt(...)))。
  • 字符串toLowerCase 是一个方法,而不是一个属性,你必须调用它(charType.toLowerCase())。你也只需要这样做一次,如果你将它设置为一个变量,你可以避免重新计算它。
  • 您需要完整字符集范围内的随机字符,而不是密码长度(使用 charSet.length)。

var length = Number(prompt("How many characters will your password be? Enter a number between 8 and 128"));

//ask for character type
var charType = prompt("Enter a character type: special, numeric, uppercase, lowercase.");

//generate password
function generatePassword() {
  //evaluate character type
  var charSet = "";
  var charTypeLower = charType.toLowerCase();
  if( charTypeLower === "lowercase" ) {
    charSet = "abcdefghijklmnopqrstuvwxyz";
  } else if( charTypeLower === "uppercase" ) {
    charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  } else if( charTypeLower === "numeric" ) {
    charSet = "0123456789";
  } else if( charTypeLower === "special" ) {
    charSet = " !\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
  } 
  //return value
  var retVal = "";
  for (var i = 0; i < length; i++) {
    //picks a character within charSet at index of random number
    retVal += charSet.charAt(Math.floor(Math.random() * charSet.length));
  }
  return retVal;
}
alert(generatePassword());

旁注:

我猜这只是为了学习目的,但如果您想生成加密安全密码,您应该使用基于crypto.getRandomValues (see this question) 的随机数生成器。

【讨论】:

  • 我的代码有一个 tiny DYI 问题。能否请您更改以仅计算一次charType.toLowerCase()
  • @PM77-1 有很大的改进空间,但可以肯定。
【解决方案2】:

charType.toLowerCase是一个函数,你想要的是 charType.toLowerCase(),是函数的结果。

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2017-11-04
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2020-05-11
    相关资源
    最近更新 更多