Tạo chuỗi mật khẩu ngẫu nhiên với các yêu cầu trong javascript


94

Tôi muốn tạo một chuỗi ngẫu nhiên có 5 chữ cái từ az và 3 số.

Làm cách nào để làm điều này với JavaScript?

Tôi có tập lệnh sau, nhưng nó không đáp ứng yêu cầu của tôi.

        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
Nếu nó đáp ứng yêu cầu của bạn, thì câu hỏi là gì? Ngoài ra, yêu cầu mật khẩu bắt buộc của bạn là một ý tưởng tồi.
Rob W


3
new Array(12).fill().map(() => String.fromCharCode(Math.random()*86+40)).join("") Nifty lót để tạo ra một mật khẩu 12 char với số ký tự đặc biệt trên thấp hơn trong một cách tiếp cận rất nhẹ
Tofandel

Câu trả lời:


313

Bắt buộc một số ký tự cố định là một ý tưởng tồi . Nó không cải thiện chất lượng của mật khẩu. Tệ hơn nữa, nó làm giảm số lượng mật khẩu có thể có, do đó việc hack bằng cách bruteforcing trở nên dễ dàng hơn.

Để tạo một từ ngẫu nhiên bao gồm các ký tự chữ và số, hãy sử dụng:

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

Làm thế nào nó hoạt động?

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

Tài liệu cho các Number.prototype.toStringstring.prototype.slicephương pháp.


6
Tôi đồng ý, nhưng đôi khi bạn không nhận được quyết định;)
ffffff01

39
KHÔNG SỬ DỤNG ĐIỀU NÀY: Vì số được chuyển đổi từ nhị phân sang thập phân và không có đủ bit để "lấp đầy" không gian thập phân đầy đủ, chữ số cuối cùng sẽ chỉ được chọn từ một tập giá trị nhất định. Ví dụ: trên máy tính của tôi, chữ số cuối cùng chỉ là "i", "r" và "9". Sử dụng cái này thay thế:Math.random().toString(36).substr(2, 8)
Joel

1
Để giải thích những gì 36 thực hiện: Từ mozilla Phương thức toString () phân tích cú pháp đối số đầu tiên của nó và cố gắng trả về một biểu diễn chuỗi trong cơ số (base) được chỉ định. Đối với các cơ số trên 10, các chữ cái trong bảng chữ cái biểu thị các số lớn hơn 9. Ví dụ: đối với các số thập lục phân (cơ số 16), từ a đến f được sử dụng. Vì vậy, theo điều này, sử dụng cơ số 36, chúng ta nhận được az sau 0-9.
Shishir Gupta

2
@ShishirGupta .toStringchỉ chấp nhận một cơ sở tối đa và bao gồm 36. Câu trả lời này có nghĩa là một lớp lót cho một chuỗi ngẫu nhiên không mật mã. Nếu bạn cũng muốn có cả viết hoa, hãy sử dụng Math.random(hoặc crypto.getRandomValuesnếu có) và ánh xạ kết quả thành az, AZ, 0-9. Ví dụ bằng cách sử dụng câu trả lời của saaj bên dưới.
Rob W

1
Không thấy cách này giải quyết yêu cầu OP "5 chữ cái từ az và 3 số" . Tôi hiểu rồi, tác giả cho rằng đó là một ý tưởng tồi ... nhưng đó là yêu cầu dù sao
mwag

38

Một cách tiếp cận dễ bảo trì và an toàn hơn một chút.

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)'>


Hơn nữa điều này không phải lúc nào cũng thêm một số mã được tạo ra và OP muốn tối thiểu 3.
qwertzman

Tìm thấy một thư viện mà window.crypto.getRandomValues hỗ trợ và làm việc tại Node.js cũng github.com/bermi/password-generator
Eugene

Tôi chỉ muốn nói rằng tôi cần một cái gì đó để tạo mật khẩu một cách nhanh chóng và điều này thật hoàn hảo. Cảm ơn bạn!
Kyle K

29

Nhiều câu trả lời (bao gồm cả bản gốc của câu này) không giải quyết được các yêu cầu về số lượng chữ cái và số của OP. Dưới đây là hai giải pháp: chung (không có chữ / số tối thiểu) và có quy tắc.

Chung:

Tôi tin rằng đây là giải pháp chung tốt hơn những giải pháp trên, bởi vì:

  • nó an toàn hơn câu trả lời được chấp nhận / được bình chọn cao nhất và cũng linh hoạt hơn, vì nó hỗ trợ mọi bộ ký tự theo cách phân biệt chữ hoa chữ thường
  • nó ngắn gọn hơn các câu trả lời khác (đối với giải pháp chung, tối đa 3 dòng; có thể là một chữ lót)
  • nó chỉ sử dụng Javascript gốc- không cần cài đặt hoặc các lib khác

Lưu ý rằng

  • để điều này hoạt động trên IE, nguyên mẫu Array.fill () phải được làm đầy
  • nếu có, tốt hơn nên sử dụng window.crypto.getRandomValues ​​() thay vì Math.random () (cảm ơn @BenjaminH đã chỉ ra)

Ba lớp lót:

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

Hoặc, như một lớp lót:

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

Với quy tắc chữ cái / số

Bây giờ, một biến thể trên. Thao tác này sẽ tạo ra ba chuỗi ngẫu nhiên từ các bộ ký tự đã cho (chữ cái, số) và sau đó xáo trộn kết quả.

Xin lưu ý phần dưới đây chỉ sử dụng sort () cho mục đích minh họa. Để sử dụng trong sản xuất, hãy thay thế hàm sort () dưới đây bằng một hàm xáo trộn chẳng hạn như Durstenfeld .

Đầu tiên, dưới dạng một hàm:

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);

Điều tương tự, như là 2 chữ lót (phải thừa nhận là các đường kẻ rất dài và xấu - và sẽ không phải là 1 chữ lót nếu bạn sử dụng chức năng xáo trộn thích hợp. Không được khuyến khích nhưng đôi khi nó vẫn thú vị):

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('');

Câu trả lời hay, nhưng chữ cái viết hoa Y sẽ không bao giờ xuất hiện trong bất kỳ mật khẩu nào bạn tạo.
Ryan Shillington

1
Cảm ơn. Tôi đã sử dụng bộ ký tự trong câu hỏi OP nhưng có vẻ như nó đã bị sai sót. Đã cập nhật ngay bây giờ.
mwag

Bạn nói "nó an toàn hơn câu trả lời được chấp nhận / được bình chọn cao nhất". Bạn có thể vui lòng giải thích lý do?
BenjaminH

Ngoài ra, việc sử dụng Math.random () có thể dự đoán được. Vì vậy, để tạo mật khẩu tốt hơn, hãy sử dụng một chức năng như window.crypto.getRandomValues.
BenjaminH

2
Lý do nó an toàn hơn là vì nó hỗ trợ số lượng ký tự có thể có trong đầu ra cao hơn so với sử dụng toString (36). Với độ dài đầu ra cố định (ví dụ: 8), nếu bạn có tối đa 36 ký tự để lựa chọn, bạn có ít hoán vị hơn nhiều so với nếu bạn có 62 ký tự (như trong ví dụ) hoặc tốt hơn, toàn bộ 95 ký tự có thể in được (ascii ) ký tự, hoặc nếu sử dụng unicode, số khả năng trên mỗi byte thậm chí còn cao hơn.
mwag

11

Đối với một người đang tìm kiếm một kịch bản đơn giản nhất. Khôngwhile (true) , không if/else, không khai báo.

Dựa trên câu trả lời của mwag, nhưng câu này sử dụng crypto.getRandomValues, một ngẫu nhiên mạnh hơn Math.random.

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

Xem này cho 0xffffffff.

Phương án 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());

Phương án 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
Điều này không cung cấp cho 20 mật khẩu độ dài nhất quán, do độ lệch không xác định. Phần + 1không cần thiết và có thể được loại bỏ.
bryc

Bắt tốt @bryc. Đã cập nhật. Cảm ơn.
Ninh Pham

1
Giải pháp hữu ích và dễ dàng. Bất kỳ ai muốn làm điều này trong NodeJS có thể chỉ cần thay thế crypto.getRandomValuesbằng crypto.randomFillSync .
Rvy Pandey

Đã thêm phiên bản Node.js. Cảm ơn @Rvy Pandey.
Ninh Pham

8

Điều này không được tối ưu hóa chính xác, nhưng nó sẽ hoạt động.

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);

Các bác sĩ cho biết thêm:

Đây là một jsfiddle để bạn thử nghiệm trên: http://jsfiddle.net/sJGW4/3/


1
chars.substring(rnum, rnum+1)giống nhưchars.charAt(rnum)
Mad Echet

7

Trong trường hợp bạn cần mật khẩu được tạo với ít nhất 1 số, 1 ký tự viết hoa và 1 ký tự viết thường:

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));

Đây là trò chơi nếu bạn muốn chơi / thử nghiệm: http://jsfiddle.net/sJGW4/155/

Đạo cụ cho @mwag vì đã cho tôi bắt đầu tạo ra cái này.


1
Bạn đang thiếu chữ thường j: P Nếu không, những thứ tốt ở đây. Đã sửa đổi nó một chút để đáp ứng yêu cầu của tôi.
Igor Yavych

7

Như @RobW lưu ý, giới hạn mật khẩu ở một số ký tự cố định như được đề xuất trong lược đồ OP là một ý tưởng tồi . Nhưng tệ hơn, các câu trả lời đề xuất mã dựa trên đó Math.randomlà một ý tưởng thực sự tồi .

Hãy bắt đầu với ý tưởng tồi . Mã OP đang chọn ngẫu nhiên một chuỗi 8 ký tự từ bộ 62. Giới hạn chuỗi ngẫu nhiên ở 5 chữ cái và 3 số có nghĩa là mật khẩu kết quả sẽ có, tốt nhất là 28,5 bit entropy (trái ngược với tiềm năng là 47,6 bit nếu giới hạn phân phối của 5 chữ cái và 3 số đã bị loại bỏ). Điều đó không tốt lắm. Nhưng trên thực tế, tình hình còn tồi tệ hơn. Các tốt nhất khía cạnh của mã bị phá hủy bởi việc sử dụng Math.randomnhư là phương tiện tạo ra dữ liệu ngẫu nhiên cho các mật khẩu. Math.randomlà một trình tạo số ngẫu nhiên giả . Do tính chất xác định của trình tạo số ngẫu nhiên giả, entropy của các mật khẩu kết quả thực sự xấu , hiển thị bất kỳ giải pháp được đề xuất nào như vậy là một ý tưởng thực sự tồi . Giả sử những mật khẩu này đang được phân phối cho người dùng cuối (o / w là gì), một kẻ thù tích cực nhận được một mật khẩu như vậy có cơ hội rất tốt để dự đoán mật khẩu trong tương lai được chuyển cho những người dùng khác và đó có lẽ không phải là điều tốt.

Nhưng trở lại chỉ ý tưởng tồi . Giả sử một trình tạo số ngẫu nhiên giả mạnh về mặt mật mã được sử dụng thay thế Math.random. Tại sao bạn giới hạn mật khẩu ở 28,5 bit? Như đã lưu ý, điều đó không tốt lắm. Có lẽ là lược đồ 5 chữ cái, 3 số là để hỗ trợ người dùng quản lý mật khẩu được ghép ngẫu nhiên. Nhưng chúng ta hãy đối mặt với nó, bạn phải cân bằng dễ sử dụng đối với giá trị sử dụng và 28,5 bit entropy không có nhiều giá trị trong việc phòng thủ trước kẻ thù tích cực.

Nhưng cái xấu cũng đủ rồi. Hãy đề xuất một con đường phía trước. Tôi sẽ sử dụng thư viện JavaScript EntropyString "tạo hiệu quả các chuỗi ngẫu nhiên mạnh về mặt mật mã của entropy được chỉ định từ các bộ ký tự khác nhau". Thay vì các ký tự OP 62, tôi sẽ sử dụng một bộ ký tự với 32 ký tự được chọn để giảm việc sử dụng các ký tự dễ nhầm lẫn hoặc hình thành các từ tiếng Anh. Và thay vì lược đồ 5 chữ cái, 3 số (có quá ít entropy), tôi sẽ công bố mật khẩu sẽ có 60 bit entropy (đây là sự cân bằng giữa mức độ dễ dàng so với giá trị).

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

"Q7LfR8Jn7RDp"

Lưu ý rằng đối số random.stringlà các bit mong muốn của entropy trái ngược với các giải pháp thường thấy hơn đối với việc tạo chuỗi ngẫu nhiên chỉ định truyền theo độ dài chuỗi (điều này vừa sai và thường không được chỉ định, nhưng đó là một câu chuyện khác).


6

Tôi đã viết một bài nhỏ lấy cảm hứng từ câu trả lời của bạn:

(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;})()

Hàm này trả về mật khẩu và có thể được sử dụng trong bookmarklet như:

javascript:alert(TheCodeOfTheFunction);

3

Tôi không khuyên bạn nên sử dụng mật khẩu bắt buộc vì nó hạn chế Bảo mật của người dùng nhưng bất kỳ cách nào, có một số cách để thực hiện điều đó -

Phương pháp JavaScript truyền thống -

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

Sử dụng chuỗi ngẫu nhiên

Cài đặt chuỗi ngẫu nhiên:

npm install randomstring

Sử dụng nó trong App.js -

var randStr = require('randomstring');

var yourString = randStr.generate(8);

Giá trị của mật khẩu của bạn đang được giữ trong biến yourString.

Không sử dụng mật khẩu bắt buộc!

Mật khẩu cưỡng bức có thể gây hại cho bảo mật của bạn vì tất cả các mật khẩu sẽ có cùng một bộ ký tự, điều này có thể dễ dàng bị vi phạm!


3

Được rồi, vì vậy nếu tôi hiểu rõ bạn đang cố gắng lấy một mật khẩu chuỗi ngẫu nhiên có 5 chữ cái và 3 số được đặt ngẫu nhiên và có độ dài 8 ký tự và bạn chấp nhận các chữ cái maj và min, bạn có thể làm điều đó bằng hàm sau :

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

Và cuối cùng, không sử dụng hack dấu chấm động:

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

Mật khẩu an toàn với một ký tự upperCase.

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

Crypto của tôi dựa trên vấn đề. Sử dụng ES6 và bỏ qua bất kỳ kiểm tra tính năng trình duyệt nào. Bất kỳ nhận xét nào về bảo mật hoặc hiệu suất?

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


1

Tạo một dịch vụ tạo mật khẩu có tên là 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('');
  }
}

đừng quên thêm dịch vụ vào mô-đun mà bạn đang sử dụng

@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 {
}

Trên bộ điều khiển của bạn, hãy thêm một phương thức gọi phương thức tạo mật khẩu bên trong dịch vụ và đặt kết quả trên trường mật khẩu

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

Tôi chỉ cần tước bỏ chức năng generatePasswordvà sử dụng nó, không cần cho cả một lớp. thnx
Biskrem Muhammad

0

Có một trình tạo chuỗi mật khẩu ngẫu nhiên với độ dài đã chọn

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

Chà, bạn luôn có thể sử dụng đối tượng window.crypto có sẵn trong phiên bản trình duyệt gần đây.

Chỉ cần một dòng mã để nhận một số ngẫu nhiên:

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

Nó cũng giúp mã hóa và giải mã dữ liệu. Thông tin thêm tại MDN Web docs - window.crypto .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.