10
votes

Générer un mot de passe sécurisé dans JavaScript

Quel est le moyen le plus rapide de générer un mot de passe sécurisé dans JavaScript?

Je veux qu'il contienne au moins 1 caractère spécial et 2 cas mixte. Doit avoir au moins 6 caractères de long.


4 commentaires

N'utilisez pas de mode sécurisé et javascript dans le même contexte;) Laissez PHP générer des mots de passe au lieu de le faire du côté client.


Peut-être utile: Stackoverflow.com/questions/5840577/... et Stackoverflow.com/questions/2477862/...


Vérifiez ceci - Stackoverflow .com / questions / 9719570 / ...


Javascript a dominé les 5 dernières années. MDR


6 Réponses :


36
votes

Voici quelques fonctions utiles code> String CODE>:

var specials = '!@#$%^&*()_+{}:"<>?\|[];\',./`~';
var lowercase = 'abcdefghijklmnopqrstuvwxyz';
var uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var numbers = '0123456789';

var all = specials + lowercase + uppercase + numbers;

var password = '';
password += specials.pick(1);
password += lowercase.pick(1);
password += uppercase.pick(1);
password += all.pick(3, 10);
password = password.shuffle();


7 commentaires

Je suis nouveau à PHP. Comment puis-je pouvoir appeler cela à partir d'un bouton avec Onclick?


Bonne réponse - ce dont j'avais besoin. J'ai ajouté mot de passe + = numéros.pick (1) pour vous assurer qu'un numéro est inclus.


Jolie solution, thx, mais dans la ligne n = min + math.floor (math.random () * (max-min)); Je remplacerais math.floor avec math.round . Le max n'a pas pu être atteint.


@algorythm: mais max est this.length , qui ne doit pas être atteint si vous l'utilisez pour indexer une chaîne.


Je ne sais pas si je comprends ... choisir choisit un nombre limité de caractères aléatoires hors d'une chaîne. Et quand j'appelle la méthode avec min et max Je m'attends à ce que la longueur minimale soit min et la longueur maximale est max . Qu'est-ce que cela a à voir avec indexation d'une chaîne? Avez-vous un exemple?


@algorythm: Je regardais la ligne ci-dessous celle que vous avez référencée, désolé. Fixé.


Math.random () n'est pas une source de hasard sécurisée. Cette réponse est faux.



7
votes

Je viens de recevoir le message maintenant. C'est une mauvaise idée d'utiliser math.random () si vous pouvez passer quelques minutes à regarder Cet article .

En réalité, il y a une API crypto dans de nouveaux navigateurs et vous devez l'utiliser dès que vous commencez quelque chose qui touche la cryptographie.

C'est pourquoi je recommande d'utiliser Ma bibliothèque qui utilise la célèbre API Crypto. Il fonctionne à la fois sur le serveur et le côté client (Nodejs et navigateurs).

mk -


2 commentaires

Ce serait une bonne idée, en ce qui concerne la transparence, de mentionner que c'est votre propre travail.


Heureux Quelqu'un a attiré le problème avec la réponse de @ Blender.



2
votes

J'ai modifié la réponse de @ Blender pour le rendre plus sécurisé et sans modifier String.Prototype.

// Copy-pasted from:
// https://stackoverflow.com/questions/12635652/generate-a-secure-password-in-javascript
// and modified for Auth0.
//
// Auth0 requirements:
// https://auth0.com/docs/connections/database/password-strength
//
// "at least 10 characters including at least 3 of the following 4 types of characters:
// a lower-case letter, an upper-case letter, a number, a special character (such as !@#$%^&*).
// Not more than 2 identical characters in a row (such as 111 is not allowed)".

const specials = '!@#$%^&*()_+{}:"<>?\|[];\',./`~';
const lowercase = 'abcdefghijklmnopqrstuvwxyz';
const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const numbers = '0123456789';

const all = specials + lowercase + uppercase + numbers;

export default function generatePassword() {
  let password = '';

  password += pick(password, specials, 1, 3);
  password += pick(password, lowercase, 1, 3);
  password += pick(password, uppercase, 1, 3);
  password += pick(password, all, 10);

  return shuffle(password);
}

function pick(exclusions, string, min, max) {
  var n, chars = '';

  if (max === undefined) {
    n = min;
  } else {
    n = min + Math.floor(Math.random() * (max - min + 1));
  }

  var i = 0;
  while (i < n) {
    const character = string.charAt(Math.floor(Math.random() * string.length));
    if (exclusions.indexOf(character) < 0 && chars.indexOf(character) < 0) {
      chars += character;
      i++;
    }
  }

  return chars;
}

// Credit to @Christoph: http://stackoverflow.com/a/962890/464744
function shuffle(string) {
  var array = string.split('');
  var tmp, current, top = array.length;

  if (top) while (--top) {
    current = Math.floor(Math.random() * (top + 1));
    tmp = array[current];
    array[current] = array[top];
    array[top] = tmp;
  }

  return array.join('');
}


0 commentaires

0
votes

Ce n'est pas un moyen sécurisé. Il serait possible de simuler la génération de mot de passe si elle dépend uniquement de la fonction mathématique (graine). Il serait plus sécurisé si vous essayez de relier la génération à l'événement utilisateur, comme le suivi de la souris (donc en utilisant différentes graines basées sur des actions de l'utilisateur).


0 commentaires

1
votes

Utilisez ce code pour un mot de passe fort: d xxx


0 commentaires

0
votes
 You could do some thing like below to generate password with following Requirements
    * At least One Special Character
    * At Least on Digit
    * At least on Upper Case
    * At least One Lower Case



function generatePassword(passwordLength) {
      var numberChars = "0123456789";
      var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      var lowerChars = "abcdefghijklmnopqrstuvwxyz";
      var specialChars = "#?!@$%^&*-";
      var allChars = numberChars + upperChars + lowerChars + specialChars;
      var randPasswordArray = Array(passwordLength);
      randPasswordArray[0] = numberChars;
      randPasswordArray[1] = upperChars;
      randPasswordArray[2] = lowerChars;
      randPasswordArray[3] = specialChars;
      randPasswordArray = randPasswordArray.fill(allChars, 4);
      return shuffleArray(randPasswordArray.map(function(x) { return x[Math.floor(Math.random() * x.length)] })).join('');
    }
    
    function shuffleArray(array) {
      for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
      return array;
    }
    
    //Change length accordingly
    alert(generatePassword(12));

0 commentaires