자바 스크립트의 요구 사항으로 임의의 암호 문자열 생성


94

az에서 5 개의 문자와 3 개의 숫자가 포함 된 임의의 문자열을 생성하고 싶습니다.

JavaScript로 어떻게 할 수 있습니까?

다음 스크립트가 있지만 내 요구 사항을 충족하지 않습니다.

        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        var string_length = 8;
        var randomstring = '';
        for (var i=0; i<string_length; i++) {
            var rnum = Math.floor(Math.random() * chars.length);
            randomstring += chars.substring(rnum,rnum+1);
        }

6
귀하의 요구 사항을 충족한다면 질문은 무엇입니까? 또한 강제 암호 요구 사항은 나쁜 생각입니다.
롭 W


3
new Array(12).fill().map(() => String.fromCharCode(Math.random()*86+40)).join("") 멋진 한 라이너는 매우 가벼운 접근 방식에 특수 문자 상하 번호 12 문자 암호를 생성합니다
Tofandel

답변:


313

고정 된 수의 문자를 강제하는 것은 나쁜 생각입니다. 암호의 품질은 향상되지 않습니다. 더 나쁜 것은 가능한 암호의 수를 줄여서 무차별 대입에 의한 해킹이 더 쉬워진다는 것입니다.

영숫자로 구성된 임의의 단어를 생성하려면 다음을 사용하십시오.

var randomstring = Math.random().toString(36).slice(-8);

어떻게 작동합니까?

Math.random()                        // Generate random number, eg: 0.123456
             .toString(36)           // Convert  to base-36 : "0.4fzyo82mvyr"
                          .slice(-8);// Cut off last 8 characters : "yo82mvyr"

Number.prototype.toStringstring.prototype.slice방법에 대한 문서입니다 .


6
동의하지만 때로는 결정을 내리지
못합니다

39
이것을 사용하지 마십시오 : 숫자가 2 진수에서 10 진수로 변환되고 전체 소수점 공간을 "채울"충분한 비트가 없기 때문에 마지막 숫자는 특정 값 집합에서만 선택됩니다. 예를 들어 내 컴퓨터에서 마지막 숫자는 "i", "r"및 "9"뿐입니다. 대신 이것을 사용하십시오 :Math.random().toString(36).substr(2, 8)
Joel

1
36의 기능을 설명하려면 : From mozilla toString () 메서드는 첫 번째 인수를 구문 분석하고 지정된 기수 (기본)로 문자열 표현을 반환하려고합니다. 기수가 10보다 큰 경우 알파벳 문자는 9보다 큰 숫자를 나타냅니다. 예를 들어 16 진수 (밑수 16)의 경우 a에서 f까지 사용됩니다. 따라서 이것에 따르면 기수 36을 사용하여 0-9 이후에 az를 얻습니다.
Shishir Gupta

2
@ShishirGupta .toString는 36까지의 염기 만 허용합니다.이 답변은 비 암호화 무작위 문자열에 대한 한 줄짜리를 의미합니다. 대문자도 사용하려면 Math.random(또는 crypto.getRandomValues사용 가능한 경우) 결과를 az, AZ, 0-9에 매핑하십시오. 예를 들어 아래 saaj의 대답을 사용하십시오.
Rob W

1
이것이 OP 요구 사항 'az의 5 개 문자와 3 개의 숫자'를 어떻게 해결하는지 알 수 없습니다 . 나는 저자가 나쁜 아이디어라고 생각 얻을 ...하지만 그럼에도 불구하고 요구 사항을의
mwag

38

좀 더 유지 관리 가능하고 안전한 접근 방식입니다.

var Password = {
 
  _pattern : /[a-zA-Z0-9_\-\+\.]/,
  
  
  _getRandomByte : function()
  {
    // http://caniuse.com/#feat=getrandomvalues
    if(window.crypto && window.crypto.getRandomValues) 
    {
      var result = new Uint8Array(1);
      window.crypto.getRandomValues(result);
      return result[0];
    }
    else if(window.msCrypto && window.msCrypto.getRandomValues) 
    {
      var result = new Uint8Array(1);
      window.msCrypto.getRandomValues(result);
      return result[0];
    }
    else
    {
      return Math.floor(Math.random() * 256);
    }
  },
  
  generate : function(length)
  {
    return Array.apply(null, {'length': length})
      .map(function()
      {
        var result;
        while(true) 
        {
          result = String.fromCharCode(this._getRandomByte());
          if(this._pattern.test(result))
          {
            return result;
          }
        }        
      }, this)
      .join('');  
  }    
    
};
<input type='text' id='p'/><br/>
<input type='button' value ='generate' onclick='document.getElementById("p").value = Password.generate(16)'>


또한이 항상 생성 된 코드에 번호를 추가하지 않고 영업 이익은 3 최소 원
qwertzman

도서관 것을 발견 Node.js를에서 지원 window.crypto.getRandomValues 및 작품뿐만 아니라 github.com/bermi/password-generator
유진

비밀 번호를 생성하기 위해 뭔가 필요하다고 말하고 싶었고 이것이 완벽했습니다. 감사합니다!
Kyle K

29

이 답변의 원본을 포함한 많은 답변은 OP의 문자 및 숫자 개수 요구 사항을 다루지 않습니다. 다음은 일반 (최소 문자 / 숫자 없음) 및 규칙 포함의 두 가지 솔루션입니다.

일반:

나는 이것이 위의 것보다 더 나은 일반적인 해결책이라고 생각합니다.

  • 대소 문자를 구분하는 방식으로 모든 문자 집합을 지원하기 때문에 수락 / 가장 많이 득표 한 답변보다 더 안전하고 더 다양합니다.
  • 다른 답변보다 간결합니다 (일반 솔루션의 경우 최대 3 줄, 한 줄로 가능)
  • 네이티브 자바 스크립트 만 사용합니다. 설치 또는 기타 라이브러리가 필요하지 않습니다.

참고

  • 이것이 IE에서 작동하려면 Array.fill () 프로토 타입을 폴리 필해야합니다.
  • 가능한 경우 Math.random () 대신 window.crypto.getRandomValues ​​()를 사용하는 것이 좋습니다 (지시를 위해 @BenjaminH에게 감사드립니다)

3 행 :

var pwdChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var pwdLen = 10;
var randPassword = Array(pwdLen).fill(pwdChars).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');

또는 한 줄로 :

var randPassword = Array(10).fill("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');

문자 / 숫자 규칙 포함

이제 위의 변형입니다. 이것은 주어진 문자 세트 (문자, 숫자, 둘 중 하나)에서 3 개의 임의의 문자열을 생성 한 다음 결과를 스크램블합니다.

아래는 설명 목적으로 만 sort ()를 사용합니다. 프로덕션 용도로 아래 sort () 함수 를 Durstenfeld 와 같은 셔플 함수로 대체하십시오 .

첫째, 함수로서 :

function randPassword(letters, numbers, either) {
  var chars = [
   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", // letters
   "0123456789", // numbers
   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" // either
  ];

  return [letters, numbers, either].map(function(len, i) {
    return Array(len).fill(chars[i]).map(function(x) {
      return x[Math.floor(Math.random() * x.length)];
    }).join('');
  }).concat().join('').split('').sort(function(){
    return 0.5-Math.random();
  }).join('')
}

// invoke like so: randPassword(5,3,2);

2 행과 똑같습니다 (분명히 매우 길고보기 흉한 선입니다. 적절한 셔플 기능을 사용하면 1 행이되지 않을 것입니다. 권장하지 않지만 때로는 재미 있습니다) :

var chars = ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz","0123456789", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"];
var randPwd = [5,3,2].map(function(len, i) { return Array(len).fill(chars[i]).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('') }).concat().join('').split('').sort(function(){return 0.5-Math.random()}).join('');

좋은 대답이지만 생성하는 비밀번호에는 대문자 Y가 표시되지 않습니다.
라이언 Shillington

1
감사. OP 질문에 문자 세트를 사용했지만 결함이있는 것 같습니다. 지금 업데이트되었습니다.
mwag

"수락 / 가장 많이 득표 한 답변보다 더 안전합니다"라고 말합니다. 이유에 대해 자세히 설명해 주시겠습니까?
BenjaminH

또한 Math.random () 사용을 예측할 수 있습니다. 따라서 암호를 생성하려면 window.crypto.getRandomValues와 같은 함수를 사용하는 것이 좋습니다.
BenjaminH

2
더 안전한 이유는 toString (36)을 사용하는 것보다 출력에서 ​​가능한 문자 수가 더 많기 때문입니다. 출력 길이가 고정되어 (예 : 8), 선택할 수있는 최대 36자인 경우 62 자 (예제에서와 같이) 또는 더 나은 경우보다 순열 수가 훨씬 적습니다. ) 문자 또는 유니 코드를 사용하는 경우 바이트 당 더 많은 가능성이 있습니다.
mwag

11

가장 간단한 스크립트를 찾고있는 사람을 위해. 아니요 while (true), 아니요 if/else, 선언이 없습니다.

mwag의 대답에 자료, 그러나 이것은 사용 crypto.getRandomValues,보다 강한 랜덤 Math.random.

Array(20)
  .fill('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$')
  .map(x => x[Math.floor(crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1) * x.length)])
  .join('');

참고 이를 위해 0xffffffff.

대안 1

var generatePassword = (
  length = 20,
  wishlist = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$"
) => Array(length)
      .fill('')
      .map(() => wishlist[Math.floor(crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1) * wishlist.length)])
      .join('');

console.log(generatePassword());

대안 2

var generatePassword = (
  length = 20,
  wishlist = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$'
) =>
  Array.from(crypto.getRandomValues(new Uint32Array(length)))
    .map((x) => wishlist[x % wishlist.length])
    .join('')

console.log(generatePassword())

Node.js

const crypto = require('crypto')

const generatePassword = (
  length = 20,
  wishlist = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$'
) =>
  Array.from(crypto.randomFillSync(new Uint32Array(length)))
    .map((x) => wishlist[x % wishlist.length])
    .join('')

console.log(generatePassword())

1
이것은 정의되지 않은 오프셋 때문에 일관되게 20 개의 길이의 암호를 제공하지 않습니다. + 1부분은 필요하지 않으며 제거 할 수 있습니다.
bryc

좋은 캐치 @bryc. 업데이트되었습니다. 감사.
Ninh Pham

1
유용하고 쉬운 솔루션. 보고 누구나 간단하게 교체 할 수 있습니다 NodeJS 내에서이 작업을 수행하기 crypto.getRandomValuescrypto.randomFillSync .
Rvy Pandey

Node.js 버전이 추가되었습니다. @Rvy Pandey에게 감사드립니다.
Ninh Pham

8

이것은 정확히 최적화되어 있지는 않지만 작동합니다.

var chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
var string_length = 8;
var randomstring = '';
var charCount = 0;
var numCount = 0;

for (var i=0; i<string_length; i++) {
    // If random bit is 0, there are less than 3 digits already saved, and there are not already 5 characters saved, generate a numeric value. 
    if((Math.floor(Math.random() * 2) == 0) && numCount < 3 || charCount >= 5) {
        var rnum = Math.floor(Math.random() * 10);
        randomstring += rnum;
        numCount += 1;
    } else {
        // If any of the above criteria fail, go ahead and generate an alpha character from the chars string
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
        charCount += 1;
    }
}

alert(randomstring);

​ ​ ​

다음은 테스트 할 jsfiddle입니다. http://jsfiddle.net/sJGW4/3/


1
chars.substring(rnum, rnum+1)같은 것입니다chars.charAt(rnum)
Mad Echet 2014-04-15

7

최소 1 개의 숫자, 1 개의 대문자, 1 개의 소문자로 생성 된 비밀번호가 필요한 경우 :

function generatePassword(passwordLength) {
  var numberChars = "0123456789";
  var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var lowerChars = "abcdefghijklmnopqrstuvwxyz";
  var allChars = numberChars + upperChars + lowerChars;
  var randPasswordArray = Array(passwordLength);
  randPasswordArray[0] = numberChars;
  randPasswordArray[1] = upperChars;
  randPasswordArray[2] = lowerChars;
  randPasswordArray = randPasswordArray.fill(allChars, 3);
  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;
}

alert(generatePassword(12));

플레이 / 테스트를 원한다면 여기 바이올린이 있습니다 : http://jsfiddle.net/sJGW4/155/

@mwag에 대한 소품으로 이것을 만들 수 있습니다.


1
소문자가 없습니다 j. : P 그렇지 않으면 바로 여기에 좋습니다. 그래도 내 요구 사항을 충족시키기 위해 약간 수정했습니다.
Igor Yavych

7

@RobW가 지적했듯이 OP 체계에서 제안한대로 암호를 고정 된 문자 수로 제한하는 것은 좋지 않습니다 . 그러나 더 나쁜 것은 코드를 기반으로 제안하는 답변 Math.random정말 나쁜 생각 입니다.

나쁜 생각 부터 시작합시다 . OP 코드는 62 개의 집합에서 8 개의 문자열을 무작위로 선택합니다. 임의의 문자열을 5 개의 문자와 3 개의 숫자로 제한하면 결과 암호는 기껏 해야 28.5 비트의 엔트로피를 갖게됩니다 (잠재력 47.6 비트와 반대). 5 문자와 3 자리 숫자의 배포 제한이 제거 된 경우). 별로 좋지 않습니다. 그러나 현실적으로 상황은 더 나쁩니다. 최상의 코드 양상의 사용에 의해 파괴되는 Math.random암호 엔트로피를 생성하는 수단. Math.randomA는 의사 난수 발생기 . 의사 난수 생성기의 결정 론적 특성으로 인해 결과 암호의 엔트로피가 매우 나쁩니다., 그러한 제안 된 솔루션은 정말 나쁜 생각을 렌더링합니다 . 이러한 암호가 최종 사용자에게 유출된다고 가정하면 (요점은 무엇입니까), 그러한 암호를 수신하는 적극적인 공격자는 다른 사용자에게 유출 될 향후 암호를 예측할 가능성이 매우 높으며 이는 아마도 좋은 일이 아닐 것입니다.

그러나 그냥 나쁜 생각으로 돌아갑니다 . 대신 암호화 된 강력한 의사 난수 생성기가 사용된다고 가정합니다 Math.random. 암호를 28.5 비트로 제한하는 이유는 무엇입니까? 언급했듯이 그것은별로 좋지 않습니다. 아마도 5 개의 문자, 3 개의 숫자 체계는 사용자가 무작위로 할당 된 암호를 관리하는 데 도움을주기위한 것입니다. 그러나의 당신이 균형을 가지고, 그것을 직면하자 사용의 용이성 에 대한 사용 가치 , 그리고 엔트로피의 28.5 비트가 활성 적 방어에 많은 값이 아닙니다.

그러나 나쁜 것은 충분합니다. 앞으로 나아갈 길을 제안합시다. "다양한 문자 집합에서 지정된 엔트로피의 암호화 된 강력한 임의 문자열을 효율적으로 생성" 하는 JavaScript EntropyString 라이브러리를 사용할 것 입니다. OP 62 자보다는 쉽게 혼동되는 문자의 사용이나 영어 단어의 형성을 줄이기 위해 32 개의 문자를 선택한 문자 세트를 사용하겠습니다. 그리고 (엔트로피가 너무 적은) 5 글자 3 개 숫자 체계가 아니라 60 비트 엔트로피 (이것이 용이성과 가치의 균형)를 가질 것이라고 선언합니다.

import {Random, charSet32} from 'entropy-string'
const random = new Random(charSet32)
const string = random.string(60)

"Q7LfR8Jn7RDp"

의 인수 random.string는 문자열 길이를 전달하는 것을 지정하는 임의의 문자열 생성에 대한보다 일반적으로 볼 수있는 솔루션과 달리 원하는 엔트로피 비트입니다 (이는 잘못 안내되고 일반적으로 지정되지 않았지만 다른 이야기입니다).


6

나는 당신의 대답에서 영감을 얻은 작은 것을 썼습니다.

(function(){g=function(){c='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';p='';for(i=0;i<8;i++){p+=c.charAt(Math.floor(Math.random()*62));}return p;};p=g();while(!/[A-Z]/.test(p)||!/[0-9]/.test(p)||!/[a-z]/.test(p)){p=g();}return p;})()

이 함수는 비밀번호를 반환하며 다음과 같은 북마크릿에서 사용할 수 있습니다.

javascript:alert(TheCodeOfTheFunction);

3

사용자의 보안을 제한하기 때문에 강제 암호를 사용하지 않는 것이 좋지만, 몇 가지 방법이 있습니다.

전통적인 JavaScript 방법-

Math.random().toString(36).slice(-8);

임의 문자열 사용

임의의 문자열 설치 :

npm install randomstring

App.js에서 사용-

var randStr = require('randomstring');

var yourString = randStr.generate(8);

암호 값은 변수에 저장 yourString됩니다.

강제 암호를 사용하지 마십시오!

강제 암호는 모든 암호가 동일한 문자 집합에 속하므로 쉽게 위반 될 수 있으므로 보안에 해를 끼칠 수 있습니다!


3

좋아, 내가 잘 이해한다면 5 개의 문자와 3 개의 숫자가 무작위로 배치되어 있고 길이가 8 자이고 maj 및 min 문자를 허용하는 임의의 문자열 암호를 얻으려고 시도하고 있다면 다음 함수를 사용하여 수행 할 수 있습니다. :

function randPass(lettersLength,numbersLength) {
    var j, x, i;
    var result           = '';
    var letters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var numbers       = '0123456789';
    for (i = 0; i < lettersLength; i++ ) {
        result += letters.charAt(Math.floor(Math.random() * letters.length));
    }
    for (i = 0; i < numbersLength; i++ ) {
        result += numbers.charAt(Math.floor(Math.random() * numbers.length));
    }
    result = result.split("");
    for (i = result.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = result[i];
        result[i] = result[j];
        result[j] = x;
    }
    result = result.join("");
    return result
}

function randPass(lettersLength,numbersLength) {
    var j, x, i;
    var result           = '';
    var letters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var numbers       = '0123456789';
    for (i = 0; i < lettersLength; i++ ) {
        result += letters.charAt(Math.floor(Math.random() * letters.length));
    }
    for (i = 0; i < numbersLength; i++ ) {
        result += numbers.charAt(Math.floor(Math.random() * numbers.length));
    }
    result = result.split("");
    for (i = result.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = result[i];
        result[i] = result[j];
        result[j] = x;
    }
    result = result.join("");
    return result
}
console.log(randPass(5,3))


2
var letters = ['a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
    var numbers = [0,1,2,3,4,5,6,7,8,9];
    var randomstring = '';

        for(var i=0;i<5;i++){
            var rlet = Math.floor(Math.random()*letters.length);
            randomstring += letters[rlet];
        }
        for(var i=0;i<3;i++){
            var rnum = Math.floor(Math.random()*numbers.length);
            randomstring += numbers[rnum];
        }
     alert(randomstring);

1

마지막으로 부동 소수점 해킹을 사용하지 않습니다.

function genpasswd(n) {
    // 36 ** 11 > Number.MAX_SAFE_INTEGER
    if (n > 10)
        throw new Error('Too big n for this function');
    var x = "0000000000" + Math.floor(Number.MAX_SAFE_INTEGER * Math.random()).toString(36);
    return x.slice(-n);
}

1

하나의 대문자로 된 보안 암호.

let once = false;

    let newPassword = Math.random().toString(36).substr(2, 8).split('').map((char) => {
                    if(!Number(char) && !once){
                        once = true;
                        return char.toUpperCase();
                    }
                    return char;
                }).join('');

    console.log(newPassword)

1

내 암호화 기반이 문제를 해결합니다. ES6를 사용하고 브라우저 기능 검사를 생략합니다. 보안이나 성능에 대한 의견이 있으십니까?

const generatePassword = (
  passwordLength = 12,
  passwordChars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
) =>
  [...window.crypto.getRandomValues(new Uint32Array(passwordLength))]
    .map(x => passwordChars[x % passwordChars.length])
    .join('');


1

PassswordGeneratorService라는 암호 생성기 서비스를 만듭니다.

import { Injectable } from '@angular/core';

@Injectable()
export class PasswordGeneratorService {

  generatePassword(length:number,upper:boolean,numbers:boolean,symbols:boolean) {
    const passwordLength = length || 12;
    const addUpper =  upper;
    const addNumbers =  numbers;
    const addSymbols =  symbols;

    const lowerCharacters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    const upperCharacters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    const numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
    const symbols = ['!', '?', '@'];

    const getRandom = array => array[Math.floor(Math.random() * array.length)];

    let finalCharacters = '';

    if (addUpper) {
      finalCharacters = finalCharacters.concat(getRandom(upperCharacters));
    }

    if (addNumbers) {
      finalCharacters = finalCharacters.concat(getRandom(numbers));
    }

    if (addSymbols) {
      finalCharacters = finalCharacters.concat(getRandom(symbols));
    }

    for (let i = 1; i < passwordLength - 3; i++) {
      finalCharacters = finalCharacters.concat(getRandom(lowerCharacters));
    }

    return  finalCharacters.split('').sort(() => 0.5 - Math.random()).join('');
  }
}

사용하는 모듈에 서비스를 추가하는 것을 잊지 마십시오

@NgModule({
  imports: [
    CommonModule,
    SharedModule,
    CommonModule,
    RouterModule.forChild(routes),
    FormsModule,
    ReactiveFormsModule,
    FlexLayoutModule,
    TranslateModule,
    ExistingUserDialogModule,
    UserDocumentsUploadDialogModule
  ],
  declarations: [
    UserListComponent,
    EditUserDialogComponent,
    UserEditorComponent
  ],
  entryComponents: [
    EditUserDialogComponent
  ],
  providers: [
    AuthService,
    PasswordGeneratorService
  ]
})
export class UsersModule {
}

컨트롤러에서 서비스 내에서 비밀번호 생성 메소드를 호출하는 메소드를 추가하고 비밀번호 필드에 결과를 설정하십시오.

  constructor(
     private passwordGenerator: PasswordGeneratorService,
    )
  get newPassword() {
    return this.password.get('newPassword');
  }
  generatePassword() {
    this.newPassword.setValue(this.passwordGenerator.generatePassword(8,true,true,true));
  }

방금 함수를 제거 generatePassword하고 사용했으며 전체 수업이 필요하지 않습니다. thnx
Biskrem Muhammad

0

선택한 길이의 임의 비밀번호 문자열 생성기가 있습니다.

let input = document.querySelector("textarea");
let button = document.querySelector("button");
let length = document.querySelector("input");

function generatePassword(n) 
{
	let pwd = "";

  while(!pwd || pwd.length < n)
  {
  	pwd += Math.random().toString(36).slice(-22);
  }
  
  return pwd.substring(0, n);
}

button.addEventListener("click", function()
{
	input.value = generatePassword(length.value);
});
<div>password:</div>
<div><textarea cols="70" rows="10"></textarea></div>
<div>length:</div>
<div><input type="number" value="200"></div>
<br>
<button>gen</button>


0

글쎄, 당신은 항상 최신 버전의 브라우저에서 사용 가능한 window.crypto 객체를 사용할 수 있습니다.

난수를 얻으려면 한 줄의 코드 만 있으면됩니다.

let n = window.crypto.getRandomValues(new Uint32Array(1))[0];

또한 데이터를 암호화하고 해독하는 데 도움이됩니다. 자세한 정보는 MDN 웹 문서-window.crypto에서 확인 하세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.