当前位置: 首页 > 知识库问答 >
问题:

Javascript密码生成器添加空格并失败测试

袁凌
2023-03-14

我正在尝试构建一个密码生成器,该生成器创建符合以下条件的密码:

  1. 最小长度为8个字符,最大长度为40个字符

我在回避数学。随机选择,我更喜欢加密选项。

我已经通过了大量的文章,试图让这个工作,但我有以下问题:

>

  • 随机空格似乎出现在输出字符串中,通常在末尾。

    输出值有时不符合min 8 char规则。

    我意识到我可能有太多额外的if语句重复检查事情,但我很难看到哪里出了问题。

    这是为了进入另一个系统,所以我正在创建一个尽可能模块化和功能化的系统。很抱歉下面的代码片段太大,我无法在jsfiddle中运行它

    function cryptoPassword(){
    
        var minFieldNum = 8;    //Minimum char size of desired output
        var maxFieldNum = 40;   //X defines their fields as 40 as the max_length    
        var outputValue = '';   //Output for field/overall function
    
        var fieldRandom = getRandomInt(minFieldNum, maxFieldNum); //Generate length of password 
    
        if (fieldRandom < minFieldNum || fieldRandom > maxFieldNum) {
        fieldRandom = getRandomInt(minFieldNum, maxFieldNum); //Regenerate if length doesn't conform - Not working? 
        }
        else {
            for (i = 0; outputValue.length < fieldRandom; i++) {
                 var mask = getRandomMask(); //Get mask selection 
                 var randomChar = mask.charAt(getRandomInt(0,mask.length)); //Pick random char in mask
                 if (randomChar == " ") { //I don't know where the spaces come from
                    var randomChar = mask.charAt(getRandomInt(0,mask.length)); //Pick random char in mask
                }
                outputValue += randomChar; //Add to output
            }
    
            if (passwordChecker(outputValue, minFieldNum)) {
                return outputValue + " " + passwordChecker(outputValue, minFieldNum);
            }
            else {
                return cryptoPassword();
            }
    
        }
    }
    
    
    function getRandomInt(min, max) {  
        var byteArray = new Uint8Array(1);  
        window.crypto.getRandomValues(byteArray);
        var range = (max - min + 1);
        return min  + (byteArray[0] % range);
    }
    
    function getRandomMask() {
        var maskLcaseChar = 'abcdefghijklmnopqrstuvwxyz';
        var maskUcaseChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        var maskNumeric = '0123456789';
        var maskSpecial = '!"$%^&*(){}[];#,./:@~<>?|_+-='; 
    
        var maskRandomNo = getRandomInt(0, 3);
        var selectMask = [maskLcaseChar, maskUcaseChar, maskNumeric, maskSpecial];  
        return  selectMask[maskRandomNo];
    }
    
    function passwordChecker(output, minSize){
        var checkChars = '!"$%^&*(){}[];#,./:@~<>?|_+-='; 
        if (output.length < minSize){
            return false
        }
        else if((output.toUpperCase() != output) && (output.toLowerCase() != output)) {
            for (var i = 0; i < output.length; i++) {
                if (checkChars.indexOf(output.charAt(i)) != -1) {
                    return true;
                }
            }
        }
        return false;
    }
    
  • 共有1个答案

    詹联
    2023-03-14

    因此,问题似乎在于getRandomInt函数,它将返回介于0和掩码长度之间的整数。在处理数组时,您确实希望它介于0和数组长度-1之间。

    当您在数组之外请求一个位置时,您从charAt函数中获取了空字符串。

    我已经修复了这个问题,并稍微优化了生成部分。它总是从每个掩码中添加一个字符,然后在那之后随机获取它们。然后我洗牌字符串,移动最初的4。它没有使用加密来洗牌,但我认为没有必要。

    function cryptoPassword(){
    
        var maskLcaseChar = 'abcdefghijklmnopqrstuvwxyz';
        var maskUcaseChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        var maskNumeric = '0123456789';
        var maskSpecial = '!"$%^&*(){}[];#,./:@~<>?|_+-=';
        var maskAll = maskLcaseChar + maskUcaseChar + maskNumeric + maskSpecial;
        var mask = '';
    
        var minFieldNum = 8;    //Minimum char size of desired output
        var maxFieldNum = 40;   //X defines their fields as 40 as the max_length
        var outputValue = '';   //Output for field/overall function
    
        var fieldRandom = getRandomInt(minFieldNum, maxFieldNum); //Generate length of password
    
        if (fieldRandom < minFieldNum || fieldRandom > maxFieldNum) {
            console.log("error length", fieldRandom)
            fieldRandom = getRandomInt(minFieldNum, maxFieldNum); //Regenerate if length doesn't conform - Not working?
    
        }
        else {
            var randomChar = '';
            var rnd;
            randomChar = maskLcaseChar.charAt(getRandomInt(0,maskLcaseChar.length)); //Pick random lower case
            outputValue += randomChar; //Add to output
            randomChar = maskUcaseChar.charAt(getRandomInt(0,maskUcaseChar.length)); //Pick random upper case
            outputValue += randomChar; //Add to output
            randomChar = maskNumeric.charAt(getRandomInt(0,maskNumeric.length)); //Pick random numeric
            outputValue += randomChar; //Add to output
            randomChar = maskSpecial.charAt(getRandomInt(0,maskSpecial.length)); //Pick random special
            outputValue += randomChar; //Add to output
            mask = maskAll;
            for (var i = 3; i < fieldRandom; i++) {
                randomChar = mask.charAt(getRandomInt(0,mask.length)); //Pick random char
                outputValue += randomChar;
            }
            outputValue = shuffleString(outputValue); //shuffle output
    
            if (passwordChecker(outputValue, minFieldNum)) {
                return outputValue + passwordChecker(outputValue, minFieldNum);
            }
            else {
                console.log("error password", outputValue);
            }
    
        }
    }
    
    function shuffleString(inputString) {
        var array = inputString.split('');
        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.join('');
    }
    
    function getRandomInt(min, max) {
        var byteArray = new Uint8Array(1);
        window.crypto.getRandomValues(byteArray);
        var range = (max - min);
        var output =  min  + (byteArray[0] % range);
    
        return output
    }
    
    function passwordChecker(output, minSize){
        var checkChars = '!"$%^&*(){}[];#,./:@~<>?|_+-=';
        if (output.length < minSize){
            console.log("too short")
            return false
        }
        else if((output.toUpperCase() != output) && (output.toLowerCase() != output)) {
            for (var i = 0; i < output.length; i++) {
                if (checkChars.indexOf(output.charAt(i)) != -1) {
                    if(output.indexOf(' ') === -1){
                        return true;
                    }
    
                }
            }
        }
        console.log("doesn't meet standards")
        return false;
    }
    
    for(j=0; j<10000; j++){
        cryptoPassword()
    }
    console.log("done")
    

    我在底部添加了一个快速测试。它将生成10000个密码。只有在测试失败时,它才会将它们输出到控制台。您可能需要删除它和一些控制台。把日志整理一下。

     类似资料:
    • 我刚刚开始一个编码训练营,对于我们的第三个作业,我们必须编写一个带有一些用户偏好的随机密码生成器。我写了我的代码,除了一位之外,一切都可以工作。当用户只选择数值时,会出现错误,我的字符选择池告诉我“pSelection.charAt不是GeneratePWD的函数”。 考虑到该函数在其他任何情况下都能完美工作,这对我来说毫无意义。我尝试为失败的特定(else-if)语句创建一个单独的数组。我尝试过

    • 我正在尝试创建一个创建密码的java程序,无论是所有小写、小写和大写、小写和大写和数字、小写和大写以及数字和标点符号,该程序还必须创建用户选择的密码之一,并且必须根据用户选择的内容生成密码长度。我已经生成了密码选项供用户选择,并提示他选择一个。我现在被困在如何创建上面提到的密码类型上。一个人建议我使用ASCII值,然后将它们转换为文本。我知道如何将它们转换为文本,但它会显示数字、字母和标点符号。有

    • 我有一个SpringBoot应用程序,它有一个控制器类、一个服务和一个存储库,运行得非常好。我已经为相同的应用程序添加了Junit测试用例,而且效果也非常好。 下面是测试类。 测试用例一直通过,但目前我正在添加另一个API,如下所示,所有测试都失败了。 下面是测试类。 添加部门服务后,测试用例失败,错误如下: 干杯!

    • 问题内容: 所以我正在尝试bcrypt。我有一类(如下所示,该类来自http://www.firedartstudios.com/articles/read/php- security-how-to-safe-store-your- passwords ),其中包含3个功能。第一个是生成随机的Salt,第二个是使用第一个生成的Salt生成哈希,最后一个是通过将提供的密码与哈希密码进行比较来验证所提

    • 我尝试在服务器上进行gpg加密/解密,对于加密,我使用以下命令行: 我想要找到原因:同一个用户有2个不同的密钥和1个秘密密钥。但现在又出现了一个问题:我删除了错误的键,并再次进行相同的测试。 解密后的答案是: 您需要一个密码短语来解锁用户的密钥:“Droli Mail_Adress”2048位RSA密钥,ID 6D2F1BE9,创建2017-07-19(主密钥ID 09C41BAC) 没有关于gp

    • <?php $pw='simplewind'; $afpw=sp_password($pw);//加密字符串 echo $afpw;//输出加密后的字符串 ?>