generate a secure password in javascript

后端 未结 6 2095
暗喜
暗喜 2021-02-02 02:25

What\'s the quickest way to generate a secure password in javascript?

I want it to contain at least 1 special character, and 2 mixed case. Must be at least 6 characters

6条回答
  •  日久生厌
    2021-02-02 03:02

    I modified @Blender's answer to make it more secure, and also without altering 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('');
    }
    

提交回复
热议问题