четверг, 27 ноября 2025 г.

JavaScript Password Brute Force

 function hasStringSimilarCharacters (string) {

    for (var characterIndex in string) {

        if (

            characterIndex > 0 &&

            string[characterIndex] === string[characterIndex - 1]

        ) {

            return true;

        }

    }

    return false;

}


function bruteForce (parameters) {


    var currentPassword = parameters.startPasswordPrefix || '';

    var filterSimilarCharacters = parameters.filterSimilarCharacters || false;

    var totalPasswordLength = parameters.totalPasswordLength;

    var charactersThatCanBeInPassword = parameters.charactersThatCanBeInPassword;

    var doOnEveryStep = parameters.doOnEveryStep;

    var doOnEnd = parameters.doOnEnd;


    if (

        doOnEveryStep &&

        currentPassword.length <= totalPasswordLength

    ) {

        doOnEveryStep(currentPassword);

    }


    if (currentPassword.length >= totalPasswordLength) {

        return [currentPassword];

    }


    var passwords = [currentPassword];


    for (var characterIndex in charactersThatCanBeInPassword) {

        var nextPassword = currentPassword + charactersThatCanBeInPassword[characterIndex];

        if (filterSimilarCharacters && hasStringSimilarCharacters(nextPassword)) {

            continue;

        }

        var nextParameters = {

            totalPasswordLength: totalPasswordLength,

            startPasswordPrefix: nextPassword,

            charactersThatCanBeInPassword: charactersThatCanBeInPassword,

            filterSimilarCharacters: filterSimilarCharacters,

            doOnEveryStep: doOnEveryStep

        };

        passwords = passwords.concat(bruteForce(nextParameters));

    }


    if (doOnEnd) {

        doOnEnd(passwords);

    }


    return passwords;


}


function isPasswordCorrect (password) {

    if (password === 'MyPassWord12') {

        return true;

    } else {

        return false;

    }

}


var startPasswordPrefix = 'MyPassWord';


var allPasswords = bruteForce({

    totalPasswordLength: startPasswordPrefix.length + 2,

    startPasswordPrefix: startPasswordPrefix,

    charactersThatCanBeInPassword: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],

    doOnEveryStep: function (password) {

        if (isPasswordCorrect(password)) {

            console.log('Correct password: ' + password);

        }

    }

});


console.log(allPasswords);