簡體   English   中英

創建一個1337密碼檢查器(javascript)

[英]Creating a 1337 password checker (javascript)

我正在處理的一些JavaScript出現問題。 目的是檢查輸入的已知錯誤密碼列表。 那部分很簡單。 但隨后它也應該能夠檢查這些密碼的“ 1337”版本。 基本上,它需要能夠檢查密碼中的數字並將其轉換為英語,然后才能通過已知的錯誤密碼功能運行。 我試圖從制作一個leet語音翻譯器中設置一個功能來做到這一點,但是它僅部分起作用,我對原因感到困惑,因為它沒有正確地進行迭代。 出現次數多於一次的字母僅在第一次被替換。 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> 

您似乎在遍歷text.length而不是LettersEnglish.lengthLettersLeet.length 這意味着,如果密碼長度短於這些數組的長度,則不會替換其中的所有字符。

@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()

因為我們有一個已知的錯誤密碼的列表,后來被告知,密碼中只有一個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";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM