87 votes

générateur de mot de passe en javascript

Quelle serait la meilleure approche pour créer un mot de passe aléatoire de 8 caractères contenant a-z , A-Z y 0-9 ?

Il n'y a absolument aucun problème de sécurité, il s'agit simplement d'un prototypage, je veux juste des données qui semblent réalistes.

Je pensais à un for (0 to 7) Math.random pour produire des codes ASCII et les convertir en caractères. Avez-vous d'autres suggestions ?

2voto

VinSta Points 21

J'ai été inspiré par les réponses ci-dessus (en particulier par l'astuce de @e.vyushin concernant la sécurité de Math.random() ) et j'ai trouvé la solution suivante qui utilise crypto.getRandomValues() pour générer un tableau rond de valeurs UInt32 avec la longueur du mot de passe.

Ensuite, il boucle dans le tableau et divise chaque élément par 2^32 (valeur maximale d'un UInt32) pour calculer le rapport entre la valeur réelle et la valeur maximale possible. Ce rapport est ensuite mis en correspondance avec la chaîne charset pour déterminer quel caractère de la chaîne est choisi.

console.log(createPassword(16,"letters+numbers+signs"));
function createPassword(len, charset) {
    if (charset==="letters+numbers") {
        var chars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    } else if (charset==="letters+numbers+signs") {
        var chars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!§$%&/?#+-_@";
    }
    var arr = new Uint32Array(len);
    var maxRange = Math.pow(2,32);
    var passwd = '';
    window.crypto.getRandomValues(arr);

    for (let i=0;i<len;i++) {
        var c = Math.floor(arr[i] / maxRange  * chars.length + 1);
        passwd += chars.charAt(c);
    }
    return passwd;
}

Ainsi, le code est capable d'utiliser l'avantage de la crypto-Classe (sécurité améliorée pour la génération de valeurs aléatoires) et est adaptable pour utiliser tout type de jeu de caractères que l'utilisateur souhaite. L'étape suivante consisterait à utiliser des chaînes d'expressions régulières pour définir le jeu de caractères à utiliser.

2voto

Sadhana Rajan Points 11

Générer un mot de passe aléatoire d'une longueur de 8 à 32 caractères avec au moins 1 minuscule, 1 majuscule, 1 chiffre, 1 caractère spécial (!@$&)

function getRandomUpperCase() {
   return String.fromCharCode( Math.floor( Math.random() * 26 ) + 65 );
}

function getRandomLowerCase() {
   return String.fromCharCode( Math.floor( Math.random() * 26 ) + 97 );
} 

function getRandomNumber() {
   return String.fromCharCode( Math.floor( Math.random() * 10 ) + 48 );
}

function getRandomSymbol() {
    // const symbol = '!@#$%^&*(){}[]=<>/,.|~?';
    const symbol = '!@$&';
    return symbol[ Math.floor( Math.random() * symbol.length ) ];
}

const randomFunc = [ getRandomUpperCase, getRandomLowerCase, getRandomNumber, getRandomSymbol ];

function getRandomFunc() {
    return randomFunc[Math.floor( Math.random() * Object.keys(randomFunc).length)];
}

function generatePassword() {
    let password = '';
    const passwordLength = Math.random() * (32 - 8) + 8;
    for( let i = 1; i <= passwordLength; i++ ) {
        password += getRandomFunc()();
    }
    //check with regex
    const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,32}$/
    if( !password.match(regex) ) {
        password = generatePassword();
    }
    return password;
}

console.log( generatePassword() );

1voto

iRaS Points 752

Encore plus courte :

Array.apply(null, Array(8)).map(function() { 
    var c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    return c.charAt(Math.random() * c.length);
}).join('');

ou comme fonction :

function generatePassword(length, charSet) {
    charSet = charSet ? charSet : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^°!"§$%&/()=?`*+~\'#,;.:-_';
    return Array.apply(null, Array(length || 10)).map(function() { 
        return charSet.charAt(Math.random() * charSet.length);
    }).join(''); 
}

1voto

Harry Moreno Points 1254

Voici une autre approche basée sur la solution de Stephan Hoyer

getRandomString (length) {
  var chars = 'abcdefghkmnpqrstuvwxyz23456789';
  return times(length, () => sample(chars)).join('');
}

1voto

Kamil Kiełczewski Points 6496
function genPass(n)    // e.g. pass(10) return 'unQ0S2j9FY'
{
    let c='abcdefghijklmnopqrstuvwxyz'; c+=c.toUpperCase()+1234567890;

    return [...Array(n)].map(b=>c[~~(Math.random()*62)]).join('')
} 

n est le nombre de caractères du mot de passe en sortie ; 62 es c.length et où, par exemple ~~4.5 = 4 est une astuce pour remplacer Math.floor

Alternative

function genPass(n)     // e.g. pass(10) return 'unQ0S2j9FY'
{
    let c='abcdefghijklmnopqrstuvwxyz'; c+=c.toUpperCase()+1234567890;

    return '-'.repeat(n).replace(/./g,b=>c[~~(Math.random()*62)])
} 

pour étendre la liste des caractères, ajoutez-les à c Par exemple, pour ajouter 10 caractères !$^&*-=+_? écrire c+=c.toUpperCase()+1234567890+'!$^&*-=+_?' et le changement Math.random()*62 à Math.random()*72 (ajouter 10 à 62).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X