Gerador de senhas flexível com Javascript

3 years ago by Jaime Neto

Hoje em dia é comum vermos cada site com regras bem diferentes pra a criação de senhas, e boa parte deles são opção de gerar automaticamente as senhas. Então, eis aqui uma sugestão de como criar, com Javascript, um gerador de senhas flexível o bastante para se adaptar às regras de cada site.

A ideia é que possamos definir grupos de caracteres, e para cada grupo, o número mínimo de caracteres requeridos para nossas senhas. Também podemos definir o tamanho da senha a ser gerada. Se a soma das quantidades mínimas para cada grupo de caractere não for menor que o tamanho da senha, novos caracteres, dentre os dos grupos, serão adicionados para completá-la:

function generatePassword(length, rules) {
    if (!length || length == undefined) {
        // default length
        length = 8;
    }

    if (!rules || rules == undefined) {
        // default rules
        rules = [
            {chars: "abcdefghijklmnopqrstuvwxyz", min: 3},
            {chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", min: 2},
            {chars: "0123456789", min: 2},
            {chars: "!@#$&*?|%+-_./:;=()[]{}", min: 1}
        ];
    }

    var allChars = "", allMin = 0;
    rules.forEach(function(rule) {
        allChars += rule.chars;
        allMin += rule.min;
    });
    if (length < allMin) {
        length = allMin;
    }
    rules.push({chars: allChars, min: length - allMin});

    var pswd = "";
    rules.forEach(function(rule) {
        if (rule.min > 0) {
            pswd += shuffleString(rule.chars, rule.min);
        }
    });

    return shuffleString(pswd);
}

Veja que utilizamos uma função para embaralhar os caracteres do string. Precisamos criá-la também:

function shuffleString(str, maxlength) {
    var shuffledString = str.split('').sort(function(){return 0.5-Math.random()}).join('');
    if (maxlength > 0) {
        shuffledString = shuffledString.substr(0, maxlength);
    }
    return shuffledString;
}

Agora vamos testar nossa função, adicionando nossas próprias regras. Para cada grupo de caracteres, podemos definir o número mínimo requerido em nossa senha. Se desejarmos, podemos simplesmente excluir um desses grupos, caso, por exemplo, não queiramos que se use caracteres especiais nas senhas, ou podemos excluir e acrescentar apenas alguns caracteres nos grupos, ou mesmo criar novos grupos:

var rules = [
    {chars: "abcdefghijklmnopqrstuvwxyz", min: 4},
    {chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", min: 1},
    {chars: "0123456789", min: 3},
    {chars: "!@#$&*", min: 2}
];
var pswd = generatePassword(15, rules);

alert(pswd);

Temos agora uma função bastante flexível para se adaptar as regras de senha de cada caso.

Comments