[예제#3] 비밀번호 생성기: 안전한 랜덤 패스워드 만들기

[예제#3] 비밀번호 생성기: 안전한 랜덤 패스워드 만들기

한줄 요약:
영문 대/소문자 + 숫자 + 특수문자를 조합해 강력한 랜덤 비밀번호를 자동으로 만들어보자!
파이썬으로 강력한 랜덤 비밀번호 생성기 만들기. secrets 모듈, 대소문자·숫자·특수문자 포함 보장, 모호문자 제외 옵션까지 제공하는 실전 예제.


1. 목표

  • 원하는 길이로 무작위 비밀번호 생성
  • 대문자/소문자/숫자/특수문자 포함 보장
  • 옵션으로 모호한 문자(I/l/O/0 등) 제외 지원

2. 완성 코드 (복붙)

# 비밀번호 생성기
import secrets
import string

def generate_password(length=12, exclude_ambiguous=True):
    """
    length: 비밀번호 길이 (기본 12)
    exclude_ambiguous: 모호한 문자(I, l, O, 0 등) 제외 여부
    """
    # 기본 문자집합
    uppercase = string.ascii_uppercase
    lowercase = string.ascii_lowercase
    digits    = string.digits
    symbols   = "!@#$%^&*()-_=+[]{};:,.?/"

    # 모호한 문자 제거(선택)
    if exclude_ambiguous:
        ambiguous = "IlO0"
        for ch in ambiguous:
            uppercase = uppercase.replace(ch, "")
            lowercase = lowercase.replace(ch, "")
            digits    = digits.replace(ch, "")

    # 각 그룹에서 최소 1개 보장
    mandatory = [
        secrets.choice(uppercase),
        secrets.choice(lowercase),
        secrets.choice(digits),
        secrets.choice(symbols),
    ]

    # 남은 길이만큼 모든 풀에서 채우기
    pool = uppercase + lowercase + digits + symbols
    remaining = [secrets.choice(pool) for _ in range(max(0, length - len(mandatory)))]

    # 섞기 (시크릿스 안전 셔플)
    password_list = mandatory + remaining
    # secrets 모듈에는 shuffle이 없어 무작위 인덱스로 섞기
    shuffled = []
    while password_list:
        idx = secrets.randbelow(len(password_list))
        shuffled.append(password_list.pop(idx))

    return "".join(shuffled)

if __name__ == "__main__":
    print("강력 비밀번호(12자):", generate_password(12))
    print("모호문자 포함 허용, 16자 :", generate_password(16, exclude_ambiguous=False))

3. 사용 방법

  1. 위 코드를 password_gen.py로 저장
  2. 터미널에서 실행: python password_gen.py
  3. 결과 예시: 강력 비밀번호(12자): xA%7p}fW!m4@ 모호문자 포함 허용, 16자 : L0g@q8R}yH7!aM#2

✨ 포인트 설명

  • secrets 모듈: 보안용 난수에 적합(비밀번호 생성에 권장)
  • 문자 그룹 최소 1개 보장: 대/소문자·숫자·특수문자 각각 하나는 반드시 포함
  • 모호문자 제거 옵션: I, l, O, 0 등 헷갈리는 문자 제외 가능

🔧 커스터마이즈 팁

  • 특수문자 세트 바꾸기: 서비스 정책에 맞게 symbols 문자열 수정
  • 기본 길이 조정: generate_password(length=16) 같이 늘리면 안전성↑
  • 여러 개 일괄 생성: for _ in range(5): print(generate_password(14))

🧪 빠른 강도 체크(간단 기준)

  • 길이 12자 이상
  • 대문자/소문자/숫자/특수문자 모두 포함
  • 연속/반복 문자(예: aaa, 1234) 피하기 → 필요하면 후처리로 검사 추가

🚨 주의사항

  • 콘솔에 출력된 비밀번호는 복사 후 안전한 비밀관리 앱(예: 키체인, Bitwarden 등)에 저장
  • 소스코드/깃 저장소에 실제 비밀번호를 절대 하드코딩하지 말 것

4. 연습문제

  1. 길이 20자 비밀번호 10개를 만들어 출력해보세요.
  2. 숫자를 최소 2개 이상 포함하도록 검증 로직을 추가해보세요.
  3. 금지어(예: 사이트명)가 포함되면 재생성하도록 만들어보세요.

이전 강좌 👈 [예제#2] 뽀모도로 타이머(콘솔 버전)
다음 강좌 👉 [자동화#1] 파일 이름 일괄 변경(사진 정리 필수 루틴)

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.