javascript - 改进安全密码生成器

标签 javascript jquery

简单密码生成器示例:

function randomPassword() {
    var chars = "abcdefghijklmnopqrstuvwxyz" +
    			"ABCDEFGHIJKLMNOP" + 
                "1234567890" +
                "@\#\-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/",
    	pass  = "",
        PL    = 10;
    
    for (var x = 0; x < PL; x++) {
        var i = Math.floor(Math.random() * chars.length);
        pass += chars.charAt(i);
    }
    return pass;
}

function generate() {
    myform.row_password.value = randomPassword();
}
<form name="myform" method="post" action="">
    <table width="100%" border="0">
        <tr>
            <td>Password:</td>
            <td>
                <input name="row_password" type="text" size="40">&nbsp;
                <input type="button" class="button" value="Generate" onClick="generate();" tabindex="2">
            </td>
        </tr>
    </table>
</form>

改进功能问题

1).获取变量内的所有值

采用上面的基本脚本,我如何调用 chars.lengthchars.charAt(i) 其中 chars 等于所有值在 Chars 中?

var Chars = {};
    Chars.abc   = "abcdefghijklmnopqrstuvwxyz";
    Chars.ABE   = "ABCDEFGHIJKLMNOP";
    Chars.Num   = "1234567890";
    Chars.Sym   = "@\#\-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/";

2).为不太高级的密码实现复选框系统

要生成不太高级的密码,例如通过取消选中复选框不包括符号框,我怎样才能让它只包含 Chars.abcChars.ABE 和使用 Chars.Num 值?

3).将密码长度除以字符数

向下舍入(密码长度/使用的字符数),即;此问题中使用的示例生成一个 10 个字符的密码并使用所有字符,因此每个 Chars 至少有 2 个字符。

最佳答案

缺少第三个功能,可能会更加复杂。但这是第一个和第二个的简单解决方案。

var output = document.getElementsByTagName('output')[0];

var Chars = {};
    Chars.length = 16;
    Chars.abc   = "abcdefghijklmnopqrstuvwxyz";
    Chars.ABE   = "ABCDEFGHIJKLMNOP";
    Chars.Num   = "1234567890";
    Chars.NumRequired = true;
    Chars.Sym   = "@\#\-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/";

var generator = new randomPasswordGenerator(Chars);

var simpleGenerator = new randomPasswordGenerator({
    length: 6,
    abc: 'abc',
    Num: '0'
});

var button = document.getElementsByTagName('button')[0];
    button.addEventListener('click', clickFunction);

var checkbox = document.getElementsByTagName('input')[0];

function clickFunction () {
  if (checkbox.checked) output.textContent = simpleGenerator.randomPassword();
  else output.textContent = generator.randomPassword();
}

function randomPasswordGenerator(opts) {
    for(var p in opts) this[p] = opts[p];
    this.randomPassword = randomPassword;
}

function randomPassword() {
    var chars = (this.abc || "") +
                (this.ABE || "") + 
                (this.Num || "") +
                (this.Sym || ""),
    	pass  = [],
        PL    = this.length;
    if (this.NumRequired) {
        var r = Math.floor(Math.random() * this.Num.length);
        var i = Math.floor(Math.random() * PL);
        pass[i] = this.Num[r];
    }
    for (var x = 0; x < PL; x++) {
        if(!pass[x]) {
          var i = Math.floor(Math.random() * chars.length);
          pass[x] = chars.charAt(i);
        }
    }
    return pass.join('');
}
output {
  margin: 12px;
  display: block;
  border-bottom: 1px solid
}
<button>Generate</button>
  <input type="checkbox">Simple
  <output></output>

关于javascript - 改进安全密码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41268149/

相关文章:

javascript - Vue v-bind 的工作原理

javascript - 这个交换数组元素的函数是如何工作的?

javascript - 尝试从 spritesheet 为 sprite Phaser 3 制作动画 - 出现错误无法读取未定义的属性 'frame'

javascript - 如何在 Chartjs 中以编程方式触发悬停

javascript - 为什么 jQuery 不包装新元素?

jquery - 以编程方式选择 <option> 在 Opera 中有效,但在 Chrome 中无效

javascript - 动态字典到JSON问题

javascript - 递归:迭代期间不确定回调函数的值

javascript - 通过 AJAX 函数循环 - 导致无限循环

JavaScript高度问题