웹 디자인/JavaScript

js 무작위 임시 비밀번호 생성하기 (대문자, 소문자, 숫자, 특수문자)

K.두부 2025. 4. 15. 20:44
반응형

금일 회사에서 임시 비밀번호가 필요한 로직을 만들었다.

추후에 도우이 될 것 같아서 간단하게 len 길이만큼 무작위로 대문자, 소문자, 숫자, 특수문자가 들어간 임시 비밀번호를 생성하는 로직을 기록한다.

 

 

const sets = {
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
lower: 'abcdefghijklmnopqrstuvwxyz',
number: '0123456789',
symbol: '!@#$%^&*()',
}

 

랜덤 생성을 위해선 정규식을 사용하지 않고, 문자열 집합이 필요함. 

 

const allChars = sets.upper + sets.lower + sets.number + sets.symbol;
const getRandomChar = (chars) => chars[Math.floor(Math.random() * chars.length)];
// 최소 하나씩 포함
let pw = [
getRandomChar(sets.upper),
getRandomChar(sets.lower),
getRandomChar(sets.number),
getRandomChar(sets.symbol)
];

 

임시 비밀번호에 대문자, 소문자, 숫자, 특수문자가 하나씩은 무조건 포함할 수 있도록 했음.

 

for (let i=pw.length; i<len; i++) {
pw.push(getRandomChar(allChars));
}

 

남은 길이만큼 대문자, 소문자, 숫자, 특수문자 중에 하나씩 골라서 len 길이만큼 넣음.

 

for (let i=pw.length-1; i>0; i--) {
const j = Math.floor(Math.random() * (i+1));
[pw[i], pw[j]] = [pw[j], pw[i]];
/*
let tmp = pw[i];
pw[i] = pw[j];
pw[j] = tmp;
[pw[i], pw[j]] = [pw[j], pw[i]] 와 동일함
*/
}

 

Fisher-Yates 셔플 알고리즘으로 무작위로 순서를 변경해줌.

 

 

[최종코드]

function createTmpPw(len) {
const sets = {
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
lower: 'abcdefghijklmnopqrstuvwxyz',
number: '0123456789',
symbol: '!@#$%^&*()',
}
const allChars = sets.upper + sets.lower + sets.number + sets.symbol;
const getRandomChar = (chars) => chars[Math.floor(Math.random() * chars.length)];
// 최소 하나씩 포함
let pw = [
getRandomChar(sets.upper),
getRandomChar(sets.lower),
getRandomChar(sets.number),
getRandomChar(sets.symbol)
];
// 나머지 문자 랜덤으로 채움
for (let i=pw.length; i<len; i++) {
pw.push(getRandomChar(allChars));
}
// Fisher-Yates Shuffle
for (let i=pw.length-1; i>0; i--) {
const j = Math.floor(Math.random() * (i+1));
[pw[i], pw[j]] = [pw[j], pw[i]];
}
return pw.join('');
}

 

 

 

 

 

반응형