암호 강도 측정기
zxcvbn 엔진 기반 실시간 분석: 일반적인 약한 비밀번호 사전, 키보드 패턴, 연속 시퀀스, 반복 및 날짜 패턴은 점수가 감소하며, "대문자+소문자+숫자+기호" 문자 개수보다 실제 보안성에 더 가깝습니다. 전 과정이 로컬에서 계산되므로 비밀번호가 브라우저 밖으로 나가지 않습니다.
- 검사 엔진
- zxcvbn
- 점수
- 0–4의 5단계
- 개인정보
- 업로드 안 함
- 사전
- 일반적인 약한 비밀번호 내장
고급 정책 설정
쉼표나 줄바꿈으로 구분하며 대소문자를 구분하지 않습니다. zxcvbn은 대소문자 변형, Leet 대체(예: Pa$$w0rd) 및 역순 작성을 자동으로 인식합니다
두 패스워드 비교
중요한 이유
대소문자·숫자·기호가 있다고 안전한 것은 아니다
P@ssw0rd!는 4가지 문자 종류를 모두 갖추고 있지만 실제 유출된 암호 목록에 올라 있습니다. 패스워드 강도는 문자 종류의 수가 아닌 추측 난이도에 달려 있습니다
약한 패스워드 사전 매칭
일반 패스워드 및 단어 목록을 내장하고 있어 일치하면 높은 패널티를 적용합니다; password, 123456, P@ssw0rd 등은 매우 약한 것으로 올바르게 판정됩니다
패턴 인식
키보드 연속, 연속 시퀀스, 반복 구간, 날짜·연도, 일반 단어는 유효 추측 공간을 크게 줄입니다
이론적 엔트로피가 아닌 실제 엔트로피
평가는 문자 집합 크기 × 길이가 아니라 인식된 구조를 기반으로 실제 추측 횟수를 예측하여 계산합니다
두 가지 크랙 시나리오
오프라인 GPU 브루트포스와 온라인 속도 제한 추측의 시간을 각각 추정하여 공격 비용에 대한 직관을 세우는 데 도움을 줍니다.
맞춤 정책과 블랙리스트
최소 길이와 문자 요건을 설정하고, 회사명, 프로젝트 코드 등 고유 약어를 추가하여 기업 암호 규범에 맞출 수 있습니다.
전체 로컬 계산
암호는 브라우저를 떠나지 않으며 어떤 서버도 통과하지 않으며, 설정은 당신의 localStorage에만 저장됩니다.
암호 강도 관련 지식
평가 원리, 해독 시간, 좋은 암호가 무엇인지에 대한 내용입니다.
zxcvbn의 0~4점은 어떻게 계산되나요?
zxcvbn은 암호를 여러 조각으로 분해합니다: 사전 단어(일반 암호, 영어 단어), 키보드 이동, 시퀀스, 반복, 날짜, 브루트포스 조각 등. 그런 다음 각 조각에 대해 공격자가 몇 번 추측해야 하는지 추정하고, 조합된 총 수를 가져온 후 0~4의 5단계로 매핑합니다. 또한 대소문자 전환, Leet 대체(@→a, 0→o), 연도 접미사 등 일반적인 변형을 자동으로 고려하므로 P@ssw0rd는 문자 종류가 많다고 해서 높은 점수를 받지 못합니다.
"유효 엔트로피"와 문자 공간의 차이점은 무엇인가요?
문자 공간은 문자 집합 크기와 길이를 곱한 이론적 상한값으로, 각 문자가 완전히 랜덤하다고 가정합니다. 하지만 실제 암호는 거의 이 조건을 만족하지 않습니다. 유효 엔트로피(이 페이지에 표시된 비트 수)는 zxcvbn이 사전 단어와 패턴을 인식한 후 추정한 실제 추측 공간입니다. 예를 들어 길이가 같은 경우 iloveyou2024의 유효 엔트로피는 랜덤 문자열보다 훨씬 낮습니다.
해독 시간은 어떻게 추정되나요? 신뢰할 수 있나요?
해독 시간 = 추정된 추측 횟수 ÷ 초당 추측 속도. 이 페이지에서는 두 가지 속도를 제공합니다: 오프라인 GPU 클러스터는 약 100억 회/초(공격자가 암호 해시를 이미 얻은 상태), 온라인 속도 제한은 약 100회/시간(로그인 인터페이스에 빈도 제한이 있음). 이는 정확한 예측이 아니라 차수 참고입니다: 실제 속도는 해시 알고리즘(bcrypt/Argon2는 MD5보다 몇 차수 더 느림), 공격자의 하드웨어 및 사전 품질에 따라 달라집니다. 하지만 10배 이내의 차이는 결론에 영향을 미치지 않으며, 수백만 배 차이가 있어야 의미가 있습니다.
어떤 암호가 좋은 암호인가요?
신뢰할 수 있는 두 가지 경로: 16자 이상의 무작위 문자열을 생성하는 암호 관리자로, 각 사이트마다 다르게 설정하는 것. 또는 관련 없는 4개 이상의 단어로 구성된 암호 구문 예 correct-horse-battery-staple으로 길이가 길고 의미가 없는 것을 선택하는 것입니다. 어느 경로를 선택하든 다단계 인증(MFA)을 함께 사용해야 하며, 동일한 비밀번호를 여러 웹사이트에서 재사용해서는 안 됩니다.
사이트에서 이미 대문자, 소문자, 숫자, 기호를 요구하는데 왜 점수가 낮게 나오나요?
기업 정책 길이, 문자 종류는 규정 준수 여부를 확인하는 기준이고, zxcvbn 점수는 추측 가능성을 평가하는 기준으로 서로 직교하는 두 가지 개념입니다. 흔한 단어 뒤에 느낌표와 연도를 추가하는 것 예 password!2024은 대부분의 정책 검사를 통과하지만 사전 공격에는 몇 초 만에 무너집니다.
제 비밀번호가 업로드되나요?
아니요. 검사는 전적으로 브라우저 내에서 JavaScript로 이루어지며, 페이지에 비밀번호를 제출하는 네트워크 요청이 전혀 없습니다. 오프라인에서도 사용할 수 있습니다. 사용자 정의 정책은 브라우저 로컬에 저장되며, 마찬가지로 비밀번호 일문자가 포함되지 않습니다.
코드 내 암호 강도 확인
자신의 등록/비밀번호 변경 양식에 실시간 강도 검사를 구현하려면 각 언어별 zxcvbn 구현을 사용할 수 있습니다:
<!-- CDN -->
<script src="https://unpkg.com/[email protected]/dist/zxcvbn.js"></script>
<script>
const res = zxcvbn('P@ssw0rd!');
console.log(res.score, res.crack_times_display);
</script>
// npm i @zxcvbn-ts/core
import { zxcvbn } from '@zxcvbn-ts/core';
const result = zxcvbn('P@ssw0rd!');
console.log(result.score, result.guesses_log10);
composer require bjeavons/zxcvbn-php
<?php
require __DIR__ . '/vendor/autoload.php';
use ZxcvbnPhp\Zxcvbn;
$zxcvbn = new Zxcvbn();
$res = $zxcvbn->passwordStrength('P@ssw0rd!');
echo $res['score'];
pip install zxcvbn
from zxcvbn import zxcvbn
res = zxcvbn('P@ssw0rd!')
print(res['score'], res['crack_times_display'])
go get github.com/nbutton23/zxcvbn-go
package main
import (
"fmt"
zxcvbn "github.com/nbutton23/zxcvbn-go"
)
func main() {
res := zxcvbn.PasswordStrength("P@ssw0rd!", nil)
fmt.Println(res.Score, res.Guesses)
}
# Add dependency
cargo add zxcvbn
use zxcvbn::zxcvbn;
fn main() {
match zxcvbn("P@ssw0rd!", &[]) {
Ok(estimate) => {
println!("score: {}", estimate.score()); // 0..4
if let Some(times) = estimate.crack_times() {
println!("offline: {:?}", times.offline_slow_hashing_1e4_per_second());
}
}
Err(err) => eprintln!("zxcvbn error: {err}"),
}
}
참고: 이 라이브러리에서 제공하는 강도 및 패턴 추정은 본 페이지와 버전 차이가 있을 수 있으나 핵심 원리는 동일합니다. 서버 측 검사 시 악의적인 장문 입력으로 인한 연산량 소모를 방지하기 위해 길이 상한과 속도 제한을 함께 적용하는 것이 좋습니다.
자주 묻는 질문
비밀번호 강도 검사기는 어떻게 작동하나요?
이 페이지는 Dropbox가 공개한 zxcvbn 알고리즘을 사용합니다. 비밀번호를 알려진 약한 비밀번호 사전, 영어 단어 목록, 키보드 배열, 시퀀스, 날짜, 반복 패턴과 일일이 대조하여 공격자가 평균적으로 몇 번 추측해야 하는지 계산한 뒤 0~4의 5단계 점수와 해킹 가능 시간으로 매핑합니다.
P@ssw0rd는 복잡해 보이는데 왜 아주 약한 비밀번호인가요?
이는 유출된 비밀번호 목록에서 가장 대표적인 약한 비밀번호 중 하나입니다. zxcvbn의 사전에 포함되어 있으며 대문자 변형과 Leet 변환(a→@, o→0)도 인식합니다. 문자 종류는 많지만 구조가 완전히 예측 가능하여 공격자의 규칙 사전에서 가장 먼저 시도하는 비밀번호입니다.
비밀번호는 얼마나 길어야 안전한가요?
무작위로 생성하는 경우, 12자 이상이면 일반적으로 온라인 공격을 막기에 충분하며, 16자 이상이면 오프라인 GPU 브루트포스 공격을 수년간 막을 수 있습니다. 길이는 문자 복잡성보다 더 중요합니다: 20자의 소문자만으로 된 무작위 문자열은 10자의 4가지 문자 종류를 혼합한 비밀번호보다 훨씬 강력합니다.
왜 해킹 시간을 온라인과 오프라인으로 나누나요?
공격 상황이 다르기 때문입니다: 웹사이트가 해킹당한 후 공격자는 로컬에서 GPU로 초당 수백억 개의 해시를 시도할 수 있지만, 온라인 로그인 인터페이스는 일반적으로 속도 제한이 있어서 초당 몇 번밖에 시도하지 못합니다. 같은 비밀번호의 생존 시간은 두 상황에서 수조 배 차이가 날 수 있으므로 구분해야 합니다.
검사 결과가 저장되나요?
저장되지 않습니다. 비밀번호는 전 과정이 당신의 브라우저 메모리에만 있으며, 새로고침하면 사라집니다; 당신이 직접 설정한 정책(길이 요구사항, 차단 목록)만 로컬 브라우저에 저장되며, 어떤 비밀번호도 포함하지 않습니다.