비밀번호 생성기
crypto.getRandomValues로 브라우저에서 생성됩니다. 전송, 저장되지 않고 URL에도 기록되지 않으므로 링크를 공유해도 유출되지 않습니다.
입력한 내용은 저장, 기록, 공유되지 않습니다.
브라우저에서 강력한 랜덤 비밀번호를 생성합니다. 모호한 강도 표시 대신 실제 엔트로피를 비트로 보여줍니다. 어떤 내용도 전송되거나 저장되지 않습니다.
사용 방법
- 길이와 포함할 문자 집합을 선택합니다.
- 즉시 생성되며 생성 버튼으로 새로 만들 수 있습니다.
- 개별로 복사하거나 전체 목록을 복사합니다.
복잡함보다 길이가 더 효과적이다
엔트로피는 길이에 문자 집합 크기의 밑이 2인 로그를 곱한 값이며, 이 공식의 모양 자체가 논지의 전부입니다. 비밀번호에 한 글자를 더하면 탐색 공간이 문자 집합 크기만큼 곱해지고, 문자 종류 하나를 통째로 더하면 한 번만 곱해집니다. 소문자만 쓴 16자 비밀번호는 약 75비트, 네 종류를 모두 쓴 12자 비밀번호는 약 79비트입니다. 기호를 넣는 것보다 소문자 네 글자를 더하는 편이 더 가치 있습니다.
대문자 하나, 숫자 하나, 기호 하나 같은 구성 규칙이 인기를 잃은 이유가 여기에 있습니다. 이론상 몇 비트를 더해 주지만, 실제로는 사람들을 앞은 대문자, 끝은 숫자와 느낌표 같은 몇 가지 뻔한 치환으로 몰아갑니다. 공격자는 이런 패턴을 명시적으로 모델링하므로, 이 규칙은 더 안전하다는 느낌을 주면서 비밀번호를 더 추측하기 쉽게 만듭니다. NIST SP 800-63B 지침이 구성 요건과 정기 변경 의무를 모두 없애고, 대신 길이와 유출된 비밀번호 목록 대조를 권장하는 것도 바로 이 때문입니다.
엔트로피는 문자열이 아니라 생성 과정을 잰다
대부분의 강도 측정기가 틀리는 부분이 이 구분입니다. 엔트로피는 비밀번호가 어떻게 선택되었는지의 성질이지, 결과로 나온 문자의 성질이 아닙니다. 72개 문자에서 균일하게 12자를 고르는 생성기는 어떤 12자가 나오든 74비트를 만듭니다. 우연히 영어 단어 철자가 된 것도 포함해서, 다른 것과 정확히 똑같이 강합니다.
반대도 성립하며, 이쪽이 더 중요합니다. 사람이 지어낸 비밀번호의 엔트로피는 그 사람의 선택 과정이 가진 만큼뿐이며, 공식이 암시하는 것보다 훨씬 작습니다. 사람들은 공간의 아주 좁은 구석에서 고르기 때문입니다. 완성된 문자열만 보는 측정기는 이것을 보지 못합니다. Tr0ub4dor&3에 높은 점수를 주지만 공격자의 단어 목록은 금방 찾아냅니다.
여기에 표시되는 수치가 정직한 이유는 생성 과정을 알고 있기 때문입니다. 치우침 없는 원천에서, 설정한 문자 집합 안에서, 균일하게 무작위로 뽑습니다. 문자열에 대한 추측이 아니라 추첨에 대한 산수입니다. 그러니 결과를 손으로 고치는 순간 이 수치는 더 이상 맞지 않습니다.
패스프레이즈
게임 컨트롤러로 입력하거나 전화로 불러 줘야 하는 비밀번호라면, 무작위 단어로 만든 패스프레이즈가 같은 강도에서 다루기 더 쉽습니다. 중요한 단어는 무작위입니다. 직접 지어낸 것이 아니라 주사위나 생성기로 목록에서 고른 것이어야 합니다.
표준 Diceware 목록에는 7,776개 단어가 있어 단어 하나가 약 12.9비트를 제공합니다. 네 단어는 약 52비트로, 그것만으로는 이제 충분하지 않습니다. 여섯 단어는 약 77비트로, 비밀번호 관리자의 마스터 비밀번호나 디스크 암호화 키처럼 외워야 하는 것에 적절한 목표입니다. 나머지 모두를 지키는 것에는 일곱이나 여덟 단어를 쓰세요.
스스로 떠올린 문구는 이 강도에 전혀 미치지 못합니다. 노래 가사, 명언, 문법에 맞는 문장은 모두 크래킹 사전에 대량으로 들어 있으며, 문법 자체가 공간을 크게 좁힙니다.
계정을 실제로 지키는 것
강도는 계정 보안에서 생성기가 도울 수 있는 부분이지만, 대개 무너지는 부분은 아닙니다.
무너지는 것은 재사용입니다. 유출된 자격 증명은 몇 시간 안에 다른 모든 서비스에 대입되므로, 여러 사이트에서 비밀번호 하나를 공유하면 가장 약한 사이트가 모든 사이트의 보안 수준을 정하게 됩니다. 공격자가 평문을 가지고 있으니 재사용한 비밀번호의 엔트로피가 아무리 높아도 소용없습니다. 사이트마다 고유한 비밀번호를 쓰는 것이 단연 가치가 가장 큰 습관이며, 이를 현실적으로 가능하게 하는 것이 비밀번호 관리자입니다. 관리자는 사람이 눈으로는 구별하지 못하는 피싱 페이지도 막아 줍니다.
그다음은 2단계 인증이며, SIM 스와핑으로 가로챌 수 있는 SMS보다 패스키나 하드웨어 키가 이상적입니다. 그리고 자신이 할 수 있는 노력의 한계도 분명히 해 둘 가치가 있습니다. 서비스가 비밀번호를 허술하게 저장하거나 평문으로 유출한다면, 당신이 무엇을 골랐든 아무 차이가 없습니다. 이는 더 긴 비밀번호가 아니라 고유한 비밀번호와 2단계 인증을 써야 한다는 근거입니다.
비밀번호는 실제로 어떻게 공격당하는가
로그인 폼에 비밀번호를 입력해 보는 온라인 추측은 사람들이 흔히 떠올리는 공격이지만 가장 효과가 없는 방식입니다. 요청 제한과 계정 잠금 때문에 계정당 시도 횟수가 몇 번으로 묶이기 때문입니다. 진짜 위협은 모두 오프라인에서 일어납니다. 해시 데이터베이스가 유출된 뒤에는 공격자를 제약하는 것이 자기 하드웨어뿐입니다.
오프라인 크래킹은 알파벳 순서대로 훑는 방식이 아닙니다. 과거 유출에서 만들어진 워드리스트, 즉 사람들이 실제로 선택한 수억 개의 비밀번호에서 시작한 뒤, 각각에 규칙을 적용합니다. 첫 글자를 대문자로 바꾸고, 뒤에 연도를 붙이고, a를 @로 바꾸고, 끝에 느낌표를 붙이는 식입니다. 비밀번호를 더 강하게 만든다고 여기며 사람들이 가하는 변형이 바로 그 규칙들이 다루는 범위입니다.
크리덴셜 스터핑은 가장 값싼 공격이며 크래킹조차 필요 없습니다. 어느 한 유출에서 나온 이메일과 비밀번호 쌍을 다른 모든 서비스에 그대로 시도해 보는 것인데, 성공률이 사업이 될 만큼 높습니다. 대부분의 사람이 재사용하기 때문입니다. 사이트마다 고유한 비밀번호를 쓰면 이용하는 사이트 한 곳이 엉망으로 운영되더라도 자신을 지킬 수 있는 이유가 여기에 있습니다.
비밀번호 관리자와 패스키의 실제
사이트마다 고유하고 엔트로피가 높은 비밀번호를 유지하는 현실적인 방법은 비밀번호 관리자뿐입니다. 그리고 두 번째 이점은 상대적으로 덜 언급됩니다. 그저 그럴듯해 보이는 도메인에서는 관리자가 자동 입력을 하지 않는다는 점입니다. 잘 만든 피싱 페이지는 사람은 속이지만 관리자는 속이지 못합니다. URL이 일치하지 않기 때문입니다.
패스키는 공유 비밀 자체를 없애면서 한 걸음 더 나아갑니다. 키 쌍이 기기에서 생성되고 개인 키는 기기를 떠나지 않으며 사이트는 공개 키만 저장합니다. 따라서 사이트 데이터베이스에는 훔칠 가치가 있는 것이 없고, 서명이 오리진에 묶여 있으므로 피싱할 대상도 없습니다. 지원 범위는 이제 브라우저와 운영체제, 주요 서비스 전반으로 넓어졌습니다.
전환은 점진적이고 어수선합니다. 대부분의 계정은 앞으로 몇 년 동안 대체 수단으로 비밀번호를 유지할 것이고, 계정 복구 절차는 두 방식 모두에서 약한 고리이며, 생태계 간 패스키 동기화도 아직 고르지 않습니다. 제공되는 곳에서는 패스키를 켜고 나머지에서는 강력하고 고유한 비밀번호를 유지하는 것이 실용적인 자세입니다.
팀이나 제품의 정책을 정할 때
요즘 나오는 지침 대부분이 따르는 기준은 NIST의 SP 800-63B이고, 그 권고는 많은 사람을 놀라게 했습니다. 문자 구성 규칙 없음, 주기적인 강제 만료 없음, 최소 길이는 여덟 자 이상이되 훨씬 긴 것도 허용, 그리고 이미 유출된 비밀번호 목록과 대조하는 선별입니다.
근거는 행동에 있습니다. 구성 규칙은 모두를 똑같이 예측 가능한 치환으로 몰아가고, 강제 교체는 Password1, Password2, Password3을 만들어 냅니다. 바꿀 때마다 더 약해지고 결국 메모지에 적히게 됩니다. 만료는 침해가 의심될 때의 대응으로는 여전히 의미가 있지만, 그것은 달력에 따르는 일과는 전혀 다릅니다.
정책 문구보다 더 중요한 구현 세부 사항이 세 가지 있습니다. 공백과 이모지를 포함해 긴 비밀번호와 모든 문자를 허용하십시오. 최대 길이 제한은 대개 비밀번호가 잘못 저장되고 있다는 신호입니다. 조용히 잘라내지 마십시오. bcrypt는 72바이트를 넘는 부분을 무시합니다. 그리고 새 비밀번호를 유출 데이터와 대조하십시오. Have I Been Pwned의 range API를 쓰면 비밀번호가 사용 가능한 형태로 클라이언트를 벗어나지 않고도 확인할 수 있습니다.
공격자가 노리는 곳은 복구 절차
모든 계정은 그 계정으로 되돌아가는 가장 약한 경로만큼만 강합니다. 재설정 링크가 외우기 쉬운 날짜로 보호된 이메일 계정으로 간다면 스무 자짜리 비밀번호는 아무 의미가 없습니다. 그래서 나머지 전부를 떠받치는 이메일 계정에는 스스로 감당할 수 있는 가장 강한 비밀번호와 가장 강한 2차 인증 수단을 써야 합니다.
보안 질문은 답이 공개된 비밀번호입니다. 피할 수 없다면 추가 비밀번호로 취급하십시오. 질문마다 임의의 문자열을 생성해 관리자에 저장하면 됩니다.
백업 코드는 사람들이 건너뛰었다가 후회하는 부분입니다. 2단계 인증을 켤 때 함께 생성해서 인쇄하거나, 인증기가 들어 있는 기기에 의존하지 않는 곳에 보관하고, 서비스가 허용한다면 두 번째 인증 수단도 등록하십시오. 아무도 대비하지 않는 실패는 공격자가 아닙니다. 휴대폰을 잃어버렸는데 유일한 2차 인증 수단이 그 안에 있던 상황입니다.
강도 표시기가 볼 수 있는 것과 없는 것
여기 표시되는 엔트로피 수치가 정직한 이유는 과정이 알려져 있기 때문입니다. 설정한 문자 집합에서의 균등 무작위 추출이며, 문자열에 대한 추측이 아니라 뽑기에 대한 산수입니다. 그리고 결과를 손으로 수정하는 순간 그 값은 더 이상 참이 아닙니다.
직접 입력한 비밀번호에 점수를 매기는 표시기는 훨씬 어려운 것을 추정합니다. zxcvbn 같은 좋은 도구는 워드리스트와 키보드 패턴, 날짜, 흔한 치환을 탐색해 그런 방법으로 얼마나 빨리 찾아낼 수 있는지를 알려줍니다. 순진한 표시기가 하는 문자 종류 세기보다 훨씬 쓸모 있는 숫자입니다.
그래서 순진한 표시기는 P@ssw0rd1에 높은 점수를 주지만 워드리스트는 그것을 밀리초 만에 찾아냅니다. 가입 폼을 만들고 있다면 패턴을 이해하는 표시기에 유출 대조를 더하는 편이 실제 위험에 대응하는 피드백을 사용자에게 줍니다. 길이와 기호로만 움직이는 색 막대는 결국 느낌표를 하나 더 붙이라고 가르칠 뿐입니다.
자주 묻는 질문
- 난수는 어디에서 오나요?
- 브라우저의 암호학적 안전 난수원인 crypto.getRandomValues에서 옵니다. Math.random은 의도적으로 쓰지 않습니다. 시계 상태로 초기화되는 빠른 의사 난수 생성기라 출력을 충분히 관찰하면 예측할 수 있기 때문입니다.
- 엔트로피 수치는 무슨 뜻인가요?
- 실제 무작위성의 비트 수로, 길이 × log2(문자 집합 크기)로 계산됩니다. 1비트가 늘 때마다 추측에 필요한 작업량이 두 배가 됩니다. 기호가 들어갔는지만 확인하는 강도 막대와 달리 이것이 정직한 강도 지표입니다.
- 엔트로피는 얼마나 필요한가요?
- 약 45비트 미만은 작정한 공격자에게 약합니다. 70비트 정도면 빠른 해시에 대한 오프라인 크래킹을 견딥니다. 100비트를 넘으면 예측 가능한 어떤 하드웨어로도 무차별 대입이 불가능합니다. 기본 설정은 100비트를 크게 넘습니다.
- 크랙 시간은 어떻게 계산하나요?
- 빠른 해시에 대해 초당 1000억 번 시도하는 오프라인 공격을 가정하고, 키 공간의 절반을 탐색하는 시간을 표시합니다. 현실적인 최악의 경우이며, 실제 로그인 화면을 상대로 한 추측은 훨씬 느립니다.
- 이 비밀번호가 어딘가로 전송되거나 기록되나요?
- 아닙니다. 브라우저에서 생성되며 전송, 저장되지 않고 URL에도 기록되지 않으므로 링크를 공유해도 유출되지 않습니다. 다만 보관은 브라우저 탭이 아니라 비밀번호 관리자를 사용하세요.
- 혼동되는 문자를 제외하는 이유는?
- 0과 O, 1과 l은 소리 내어 읽거나 종이에서 옮겨 적을 때 구분하기 어렵기 때문입니다. 제외하면 엔트로피가 조금 낮아지므로 켤 때 비트 수 표시도 함께 갱신됩니다.
마지막 업데이트:
진행 단계, 예상 결과, 실제 결과를 적어 주세요. 비밀 정보와 개인 정보는 삭제해 주세요.
