【问题标题】:How to generate a random password using these requirements? [closed]如何使用这些要求生成随机密码? [关闭]
【发布时间】:2013-05-11 08:36:27
【问题描述】:

我可以在 C# 中执行此操作,但无法将其转换为 Javascript。我找到了这篇文章“Generate random password string with requirements in javascript”,但我无法根据自己的要求进行自定义:

密码长度应至少为 8 个字符,最多 13 个字符,并且必须包含以下每个字符串集合中的至少一个字符:

string specialCharacters = "~!@#$%^&*()_+=-|\\}]{[\"':;?/>.<,";
string numbers = "0123456789";
string smallLetters = "abcdefghijklmnopqrstuvwxyz";
string capitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

你能帮忙吗? 非常感谢!

编辑:

这是我的 C# 代码。抱歉,有点长:

private string CreateRandomPassword(int passwordLength)
        {
            string specialCharacters = "~!@#$%^&*()_+=-|\\}]{[\"':;?/>.<,";
            string numbers = "0123456789";
            string smallLetters = "abcdefghijklmnopqrstuvwxyz";
            string capitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string allowedChars = "";

            char[] chars = new char[passwordLength];
            string password = String.Empty;
            Random rd = new Random();

            int ctr = 0;
            int prop = 4;

            if(!_password.ContainsSpecialCharacters && !_password.ContainsNumbers && !_password.ContainsSmallLetters && !_password.ContainsCapitalLetters)
                return String.Empty;

            string sc = "";
            string num = "";
            string sl = "";
            string cl = "";

            if(_password.ContainsSpecialCharacters)
            {
                // Get a special character randomly
                rd = new Random();
                sc = specialCharacters[rd.Next(0, specialCharacters.Length)].ToString();
                allowedChars += specialCharacters;
            }
            else
            {
                prop--;
            }

            if(_password.ContainsNumbers)
            {
                // Get a random number randomly
                rd = new Random();
                num = numbers[rd.Next(0, numbers.Length)].ToString();
                allowedChars += numbers;
            }
            else
            {
                prop--;
            }

            if(_password.ContainsSmallLetters)
            {
                // Get a small letter randomly
                rd = new Random();
                sl = smallLetters[rd.Next(0, smallLetters.Length)].ToString();
                allowedChars += smallLetters;
            }
            else
            {
                prop--;
            }

            if(_password.ContainsCapitalLetters)
            {
                // Get a capital letter randomly
                rd = new Random();
                cl = capitalLetters[rd.Next(0, capitalLetters.Length)].ToString();
                allowedChars += capitalLetters;

            }
            else
            {
                prop--;
            }

            for (; ctr < passwordLength - prop; ctr++)
                password += allowedChars[rd.Next(0, allowedChars.Length)];


            return password + sc + num + sl + cl;
        }

【问题讨论】:

  • 您需要什么帮助?你的问题到底是什么?你试过什么?为什么它不起作用?这会做:“~0aAAAAA”吗?
  • 我无法将我的 C# 代码翻译成 Javascript
  • 那么您的所有允许字符集是什么?只是这四组中的所有角色吗?
  • @yonan2236:代码非常简单,就像您的 C# 代码一样。你在翻译方面有什么尝试,你在哪里有问题?
  • 在创建此站点并构建常见问题解答时考虑了该站点对全世界的可见性。糟糕的英语是可以容忍的,但“我想要这个网站的代码,只是我想把它转换成另一种语言——请帮忙”是不行的。

标签: javascript


【解决方案1】:

这是我想出的。

只需在 JavaScript 控制台中运行它。

(function() {
    var passwd, classTypes, classCount, len, chars, classIndex, charIndex;
    do {
        passwd = "";
        classTypes = [];
        classCount = 0;
        len = Math.round(Math.random() * 5 + 8);
        chars = ["~!@#$%^&*()_+=-|\\}]{[\"':;?/>.<,", "0123456789",
            "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
        while (passwd.length < len) {
            classIndex = Math.round(Math.random() * 3);
            classTypes[classIndex] = true;
            charIndex = Math.round(Math.random()
                * (chars[classIndex].length - 1));
            passwd += chars[classIndex].charAt(charIndex);
        }
        console.log(JSON.stringify(classTypes));
        classCount = classTypes.filter(function(value, index, object) {
            return value === true;
        }).length;
        console.log("classCount = " + classCount);
        console.log("passwd.length = " + passwd.length);
    } while (classCount < 4);
    console.log("generated pasword is \n" + passwd + "\n");
    console.log("but see http://xkcd.com/936/ for a better approach to paswords");
})();

【讨论】:

    【解决方案2】:

    试试

    var specialCharacters = "~!@#$%^&*()_+=-|\\}]{[\"':;?/>.<,";
    var numbers = "0123456789";
    var smallLetters = "abcdefghijklmnopqrstuvwxyz";
    var capitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    var srcs = [specialCharacters, numbers, smallLetters, capitalLetters];
    
    function getRandomChar(string){
        var pos = Math.floor(Math.random() * string.length);
        return string.charAt(pos);
    }
    
    //+ Jonas Raoni Soares Silva
    //@ http://jsfromhell.com/array/shuffle [v1.0]
    function shuffle(o){ //v1.0
        for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
        return o;
    }
    function generate(){
        var len = 8 + Math.floor(Math.random() * 5);
    
        var array = [];
        array.push(getRandomChar(specialCharacters));
        array.push(getRandomChar(numbers));
        array.push(getRandomChar(smallLetters));
        array.push(getRandomChar(capitalLetters));
    
        for(var i = 4; i < len; i++){
            var pos = Math.floor(Math.random() * srcs.length);
            array.push(getRandomChar(srcs[pos]));
        }
        return shuffle(array).join('')
    }
    
    for(var i = 0; i < 10; i++){
        console.log(generate())
    }
    

    演示:Fiddle

    【讨论】:

    • 很高兴为他做他的工作,但是以这种方式回答这类问题(只是一段代码,没有任何解释)会刺激他提出更多这样的坏问题。
    • @Mischa 我这样做是因为我觉得它有点好笑并且为了测试我自己,如果 OP 想学习他/她可以通过阅读它或通过在 cmets 中提出任何疑问来学习
    • 我刚刚因为这个问题失去了 5 点声誉:)。我实际上并不关心分数,只是想知道他们为什么投反对票。我的问题根本没有任何意义吗?也许他们也应该考虑到这是一个全世界都可以看到的网站,并不是所有的用户都无法像以英语为母语的人那样表达自己。我只是想通过举一些例子来学习javascript。无论如何,非常感谢那些回答并试图通过判断来理解我的问题的人:)
    • @yonan2236:你的问题是有道理的,但它没有表现出任何努力。通常,这里的人希望您在询问之前付出一些努力。展示您在 Javascript 中尝试过的内容以及您遇到的问题,并提出一个具体的问题。这是一个糟糕的问题,因为您只是在粘贴一大段代码,并希望有人会为您翻译。不幸的是,阿伦为你做了这件事,从而奖励了你的不良行为。这是对回答者的懒惰和不尊重。当您遇到困难时,请表现出一些努力并提出具体问题。
    • @yonan2236,这里不是学习语言的地方。为此,有教程、书籍、编程课程和截屏视频。如果——在学习的过程中——你遇到了你不明白的东西,你可以在这里询问。你不同意只是转储一大块代码并期望有人为你翻译它有点粗鲁吗?只是一个想法......
    【解决方案3】:

    要检查它是否包含任一字符串中的字符,您可以使用Javascript Regular Expressions。只需根据链接将您的候选密码与这些字符匹配即可。你将尝试四场比赛。字符串的长度,可以查看其length属性。

    【讨论】:

    • 问题不是关于验证密码(正则表达式可能有用),而是关于生成一个新的随机密码。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2016-01-24
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2010-12-22
    • 2010-09-08
    相关资源
    最近更新 更多