创建1337密码检查器(javascript)

时间:2015-02-04 08:19:36

标签: javascript html

我正在处理一些我正在处理的JavaScript问题。目的是检查已知错误密码列表的输入。那部分很简单。但是它也应该能够检查这些密码的“1337”版本。基本上它需要能够检查密码中的数字并将其转换为英语,然后运行已知的错误密码功能。我试图设置一个函数来完成Making a leet speak translator,但它只是部分工作,我很困惑为什么,因为它没有正确迭代。多出一次的字母只会在第一次被替换。还有问题是l或i是相同的数字。我希望有人能看一眼吗?

<script>    
var LettersEnglish = 
    new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '1', '3', '4', '5', '7');

function changeLetters() { // change all letters
    var text = document.getElementById("password").value;
    for (var i = 0; i < text.length; i++) {
        text = text.replace(LettersLeet[i], LettersEnglish[i]);
        }englishPasswords(text);
}

function englishPasswords(convertedstring) {
    var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
    var string = (myarr.indexOf(convertedstring) > -1);
    if (string === true){
        document.getElementById("output").innerHTML = convertedstring + " is a bad password";
    }else{
        document.getElementById("output").innerHTML = convertedstring + " is an acceptable password";
    }
}
</script> 

3 个答案:

答案 0 :(得分:1)

您似乎正在迭代text.length而不是LettersEnglish.lengthLettersLeet.length。这意味着如果您的密码短于这些数组的长度,则不会替换其中的所有字符。

答案 1 :(得分:1)

@MTCoaster是正确的,因为你正在迭代错误的东西。你需要这样的东西:

for (var i = 0; i < LettersLeet.length; i++) {
  text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish[i]);
}

请注意,replace()调用现在使用正则表达式作为第一个参数,并且使用“global”标志创建正则表达式。这允许replace()替换所有匹配项。你调用它的方式,以字符串作为第一个参数,只会替换第一个匹配项。

关于i / l映射,你不是将它们都映射到1,而是反过来,在检查错误密码时,你需要将1作为i和l对待。 1不可能同时映射到两者。一种简单的方法可能是:

var LettersEnglish1 = 
    new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 = 
    new Array('o', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '3', '4', '5', '7');

然后,在changeLetters()内:

var text1 = document.getElementById("password").value,
    text2 = text;
for (var i = 0; i < LettersLeet.length; i++) {
  text1 = text1.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
  text2 = text2.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish2[i]);
}
//Now check both text1 and text2 for validity

完整的解决方案应该检查i和l的所有可能的排列。例如,如果密码为1n1t1a1,则需要检查2 ^ 4(16)个不同的替换密码。

最后,一个风格建议:

var LettersEnglish1 = 
    new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 = 
    new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet = 
    new Array('0', '1', '3', '4', '5', '7');

通常写为

var LettersEnglish1 = ['o', 'i', 'e', 'a', 's', 't'],
    LettersEnglish2 = ['o', 'l', 'e', 'a', 's', 't'],
    LettersLeet = ['0', '1', '3', '4', '5', '7'];

有些人可能更愿意使用多个var语句,但大多数人使用数组文字语法而不是new Array()

答案 2 :(得分:0)

因为我们有一个已知的错误密码列表,后来被告知,密码中只有一次1密码的实例是我接下来的答案。为了检查除L之外的所有字母,我使用了@ PeterHerdenborg的答案。

var LettersEnglish1 = ['o', 'e', 'a', 's', 't', 'i'],
    LettersLeet = ['0', '3', '4', '5', '7', '1'];

function changeLetters() {
    var text = document.getElementById("password").value;
    for (var i = 0; i < LettersLeet.length; i++) {
        text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
        //console.log(text);
        englishPasswords(text);
    }
}

function englishPasswords(text) {
    var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
    var string = (myarr.indexOf(text) > -1);
    if (string === true){
        document.getElementById("output").innerHTML = text + " is a bad password";
    }else{
        checkForLs(text);
    }
}

function checkForLs(text){
    text = text.replace('i','l')
    if(text == 'letmein'){
        document.getElementById("output").innerHTML = text + " is a bad password";
    }else{
        document.getElementById("output").innerHTML = text + "thats an acceptable password";
    }
}