Skip to content
블로그로 돌아가기
보안

비밀번호 엔트로피: 온라인으로 계산하고 강화하는 방법

비밀번호 엔트로피 공식, 무차별 대입 계산, 왜 길이가 복잡성을 이기는지 정리합니다. JS/Python 예제와 온라인 생성기 포함.

10분 소요

비밀번호 엔트로피: 측정 방법과 강도 극대화

‘강력한 비밀번호’는 대문자, 숫자, 특수 문자를 모두 포함해야 한다는 이야기를 한 번쯤 들어 보셨을 것입니다. 그런데 P@$$w0rd!는 이 규칙을 모두 충족하면서도 1초 안에 해독됩니다.

비밀번호 강도의 진짜 척도는 어떤 문자를 쓰는가가 아닙니다. 바로 엔트로피입니다. 엔트로피는 정보 이론에서 나온 개념으로, 비밀번호가 실제로 얼마나 예측 불가능한지를 정량화합니다.

이 가이드에서는 비밀번호 엔트로피가 어떻게 작동하는지, 어떻게 계산하는지, 그리고 실제로 해독하기 어려운 비밀번호를 어떻게 생성하는지 정확히 알아봅니다.

비밀번호 엔트로피란?

비밀번호 엔트로피는 비밀번호가 얼마나 예측 불가능한지를 비트 단위로 측정합니다. 엔트로피가 1비트 늘어날 때마다 공격자가 무차별 대입으로 해독하려고 시도해야 하는 횟수는 두 배가 됩니다.

주사위에 비유해 볼 수 있습니다. 6면 주사위는 한 번 굴릴 때마다 약 2.6비트의 엔트로피가 있습니다. 가능한 결과가 6가지뿐이기 때문입니다. 20면 주사위는 약 4.3비트입니다. 면이 많을수록 불확실성도 커집니다.

비밀번호도 같은 방식으로 동작합니다. 가능한 문자가 많을수록(‘큰 주사위’), 그리고 비밀번호의 문자 수가 많을수록(‘많이 굴릴수록’) 엔트로피가 커집니다.

바로 이 지점에서 엔트로피가 복잡성 규칙보다 더 좋은 척도라는 사실이 드러납니다. 비밀번호가 복잡해 보여도(Tr0ub4dor&3) 예측 가능한 패턴을 따르면 엔트로피는 낮습니다. 반대로 단순해 보이는 패스프레이즈(correct horse battery staple)는 큰 후보 집합에서 뽑혔기 때문에 오히려 엔트로피가 높을 수 있습니다.

공식: 비밀번호 엔트로피 계산법

공식은 간단합니다.

E = L × log₂(R)

각 기호의 의미는 다음과 같습니다.

  • E = 엔트로피(비트)
  • L = 비밀번호 길이(문자 수)
  • R = 집합 크기(한 자리에 올 수 있는 문자 수)

문자 집합 크기

문자 종류집합 크기 (R)문자당 비트
소문자만 (a-z)264.70
소문자 + 숫자365.17
대소문자 + 숫자625.95
출력 가능한 전체 ASCII946.55
Diceware 단어 목록7,776단어당 12.92

코드로 계산하기

// JavaScript로 비밀번호 엔트로피 계산
const entropy = (length, poolSize) =>
  length * Math.log2(poolSize);

entropy(8, 26);   // → 37.60 비트 (소문자만)
entropy(12, 62);  // → 71.45 비트 (영숫자)
entropy(16, 94);  // → 104.87 비트 (전체 문자 집합)
import math

def entropy(length: int, pool_size: int) -> float:
    return length * math.log2(pool_size)

entropy(8, 26)   # → 37.60 비트
entropy(12, 62)  # → 71.45 비트
entropy(16, 94)  # → 104.87 비트

중요: 이 공식은 각 문자가 균일한 무작위로 선택된다고 가정합니다. 사람이 패턴이나 사전 단어를 바탕으로 고른 비밀번호라면 실제 엔트로피는 이론적 최댓값보다 훨씬 낮아집니다.

엔트로피는 얼마나 있어야 충분한가?

답은 무엇을 보호하려 하는지, 그리고 공격자가 얼마나 빠르게 시도할 수 있는지에 달려 있습니다.

요즘 GPU는 MD5 같은 빠른 알고리즘에 대해 초당 10¹²(1조) 회 이상의 비밀번호 해시를 시험할 수 있습니다. 이를 실제 기준으로 바꿔 보면 다음과 같습니다.

엔트로피(비트)강도10¹² 회/초에서의 해독 시간권장 용도
< 40약함1초 미만사용 금지
40–59보통수 초 ~ 수 시간일회성 계정
60–79강함수 일 ~ 수 세기일반 계정
80–99매우 강함수천 년 이상이메일, 금융
100+극강우주 열 죽음을 넘어서는 시간암호화 키, 마스터 비밀번호

출력 가능한 전체 ASCII 집합을 쓰는 16자 비밀번호는 약 105비트의 엔트로피를 가지며, 이는 충분히 ‘극강’ 구간에 들어갑니다. 무작위 비밀번호 생성기를 쓰면 바로 이런 비밀번호를 즉시 생성할 수 있습니다. 모든 결과에 대해 실시간 엔트로피 분석을 표시합니다.

NIST 권고 (2024년 개정)

2024년에 개정된 NIST SP 800-63B는 비밀번호 지침에 큰 변화를 주었습니다.

  • 필수 복잡성 규칙 폐지(특수 문자 강제 요구 철회)
  • 주기적 비밀번호 변경 의무 폐지
  • 최소 길이 15자로 상향(이전 버전의 8자에서 상향)
  • 유출된 비밀번호 데이터베이스 대조 강조
  • 복잡성보다 길이와 무작위성을 우선

이 변화는 엔트로피 수학이 오래전부터 보여 주던 결론을 반영합니다. 길이와 무작위성이 문자 종류의 다양성보다 더 중요합니다.

왜 길이가 복잡성을 이기는가

수학으로 확인해 봅니다. 12자 비밀번호의 엔트로피를 높이는 두 가지 방법을 비교해 봅시다.

옵션 A — 12자를 유지하고 영숫자(62)에서 전체 ASCII(94)로 전환:

  • 12 × log₂(94) − 12 × log₂(62) = 78.66 − 71.45 = +7.21 비트

옵션 B — 영숫자(62)를 유지하고 한 글자를 추가(12 → 13):

  • 13 × log₂(62) − 12 × log₂(62) = 77.40 − 71.45 = +5.95 비트

한 글자만 추가해도 훨씬 더 큰 문자 집합으로 바꾼 것과 비슷한 엔트로피 증가를 얻습니다. 두 글자를 추가하면 그 증가분을 넘어섭니다.

이제 P@$$w0rd!(9자)를 생각해 봅시다. 이 비밀번호는 전체 ASCII 집합을 쓰지만 길이가 짧습니다. 더 나쁘게는 사전 공격이 이미 파악하고 있는 예측 가능한 ‘leet speak’ 패턴을 따릅니다. 따라서 유효 엔트로피는 이론치인 59비트보다 훨씬 낮습니다.

결론: 진정한 무작위 비밀번호라면 문자 종류를 추가하는 것보다 길이를 늘리는 쪽이 더 효율적입니다. 그러나 진짜 적은 길이 부족이 아니라 예측 가능성입니다.

패스프레이즈 vs 무작위 비밀번호

항목무작위 비밀번호패스프레이즈 (Diceware)
예시kX#9mP$2vL!nQ7wRcorrect horse battery staple
단위당 비트문자당 6.55단어당 12.92
약 78비트에 필요한 길이12자6단어
암기 용이성낮음높음
모바일 입력번거로움쉬움
적합한 용도비밀번호 관리자 저장용마스터 비밀번호, 암기 로그인

Diceware 작동 방식

Diceware는 7,776개(6⁵ = 7,776) 항목의 단어 목록을 사용합니다. 주사위 다섯 개를 굴려 단어를 하나 고르며, 이렇게 뽑은 단어는 정확히 단어당 12.92비트의 엔트로피를 가집니다.

4단어는 약 51비트, 6단어는 약 77비트입니다.

어느 쪽을 써야 할까?

  • 관리자에 저장할 비밀번호: 전체 문자 집합을 쓰는 16자 이상의 무작위 비밀번호를 사용하십시오. 직접 입력할 일이 없으므로 암기 용이성은 중요하지 않습니다. 무작위 비밀번호 생성기는 한 번에 최대 50개를 일괄 생성할 수 있습니다.
  • 마스터 비밀번호: 56단어 Diceware 패스프레이즈를 사용하십시오. 6477비트의 엔트로피가 확보되면서도 매일 타이핑할 수 있을 만큼 기억하기 좋습니다.
  • API 키와 토큰: 사람이 기억할 필요가 없으므로 엔트로피를 최대화하려면 openssl randcrypto.randomBytes()를 사용하십시오.

실무에서의 엔트로피: 개발자 도구와 코드

개발자들이 고엔트로피 비밀값을 생성할 때 자주 쓰는 방법을 정리했습니다.

브라우저 (Web Crypto API)

// 암호학적으로 안전한 비밀번호 생성
function generatePassword(length, charset) {
  const array = new Uint32Array(length);
  crypto.getRandomValues(array);
  return Array.from(array, v => charset[v % charset.length]).join('');
}

const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
generatePassword(16, chars);
// → 'kX#9mP$2vL!nQ7wR' (매번 무작위)

Node.js

const crypto = require('crypto');
const token = crypto.randomBytes(32).toString('base64url');
// → 'Ql2Hj8xK9mNp3rVw5tYz7uBa0cEf4gIk' (43자, 256비트)

Python

import secrets
token = secrets.token_urlsafe(32)  # 256비트 엔트로피
password = secrets.token_hex(16)    # 128비트, 16진수 형식

명령줄

# 192비트 엔트로피, Base64 인코딩
openssl rand -base64 24

# 256비트, 16진수 인코딩
openssl rand -hex 32

방식별 엔트로피 비교

방식출력 길이엔트로피(비트)
UUID v436자122
openssl rand -base64 2432자192
전체 ASCII 16자16자105
6단어 Diceware약 30자78
4단어 Diceware약 20자52

Math.random()은 보안과 관련된 용도에 절대 쓰지 마십시오. 이 함수는 비암호학적 PRNG를 사용하므로, 공격자가 시드를 알면 출력이 예측 가능합니다. 브라우저에서는 항상 crypto.getRandomValues(), Node.js에서는 crypto.randomBytes()를 사용하십시오.

비밀번호 저장: 엔트로피만으로는 부족한 이유

128비트 비밀번호라도 서버가 평문 MD5 해시로 저장한다면 아무 소용이 없습니다. 데이터베이스가 유출되면 공격자는 GPU 한 대로 초당 수조 회의 MD5 해시를 시험할 수 있습니다.

바로 이 지점에서 느린 해싱 알고리즘이 등장합니다. 이들은 의도적으로 한 번의 추측을 비싸게 만듭니다.

알고리즘GPU 속도실효 감속
MD5초당 약 100억 회기준선 (사용 금지)
SHA-256초당 약 50억 회약 2배 느림
bcrypt (cost=12)초당 약 5회약 20억 배 느림
argon2id초당 약 2회약 50억 배 느림

bcrypt의 cost 파라미터는 특히 정교합니다. 값이 1 늘어날 때마다 필요한 계산량이 두 배가 됩니다. cost 12는 2¹² = 4,096회의 해싱 라운드를 의미합니다. 결과적으로 비밀번호 자체의 엔트로피 위에 12비트의 ‘저장 엔트로피’를 덧붙이는 효과가 있습니다.

이중 방어 모델: 고엔트로피 비밀번호는 오프라인 무차별 대입을 막고, 느린 해싱은 데이터베이스 유출에 대응합니다. 두 가지 모두 필요합니다.

해시 알고리즘에 대한 자세한 내용은 MD5 vs SHA-256 비교를 참고하시고, MD5 해시 생성기에서 서로 다른 알고리즘이 어떤 출력을 만드는지 직접 확인해 보십시오.

자주 듣는 비밀번호 오해 바로잡기

’90일마다 비밀번호를 변경하세요’

NIST의 2024년 지침은 주기적 변경 의무화를 명시적으로 권장하지 않습니다. 잦은 변경을 강요하면 사용자는 더 약하고 예측 가능한 비밀번호를 고릅니다. 끝에 숫자를 하나 붙이거나 몇 개를 돌려 쓰는 식입니다. 비밀번호는 유출이 의심될 때만 변경하십시오.

‘a→@, e→3 치환이 더 강하게 만든다’

Leet speak 치환은 사전 공격이 가장 먼저 시도하는 패턴 중 하나입니다. passworda@로 바꾼다고 해서 공격자가 이미 예상하고 있으므로 추가되는 엔트로피는 사실상 0에 가깝습니다.

엔트로피를 높이는 것은 기발한 치환이 아니라 진짜 무작위성입니다.

‘기호를 넣은 8자면 충분하다’

94자짜리 전체 ASCII 집합을 쓰더라도 8자는 52비트의 엔트로피밖에 되지 않습니다. 초당 10¹² 회의 속도라면 약 75분 만에 해독됩니다.

최소 12자, 중요한 계정이라면 16자 이상을 사용하십시오.

‘복잡해 보일수록 안전하다’

시각적 복잡성과 엔트로피는 다른 개념입니다. Tr0ub4dor&3은 복잡해 보이지만 예측 가능한 ‘기본 단어 + 치환’ 패턴을 따릅니다. mfYq8kL2nR은 오히려 단순해 보이지만 진짜 무작위이기 때문에 엔트로피가 더 높습니다.

보안 전략을 종합적으로 설계하려면 인증, 세션 관리, 유출 모니터링 같은 관행을 함께 살펴보는 것이 좋습니다.

FAQ

보안에 충분한 엔트로피 비트는 몇 비트인가요?

대부분의 온라인 계정에는 60~80비트면 강력한 보호가 됩니다. 마스터 비밀번호나 암호화 키 같은 고가치 대상이라면 100비트 이상을 목표로 하십시오. 엔트로피가 1비트 늘어날 때마다 공격자가 들여야 하는 노력은 두 배가 됩니다.

특수 문자를 넣으면 항상 엔트로피가 올라가나요?

아닙니다. 해당 문자가 전체 집합에서 무작위로 선택된 경우에만 엔트로피가 올라갑니다. a@로 바꾸거나 끝에 !를 붙이는 식의 예측 가능한 치환은 공격자의 사전에 이미 반영되어 있으므로 사실상 엔트로피를 거의 추가하지 못합니다.

4단어 Diceware 패스프레이즈의 엔트로피는 얼마인가요?

표준 7,776단어 Diceware 목록을 쓰면 단어 하나가 12.92비트를 기여합니다. 4단어면 약 51.7비트로 낮은 보안 등급 용도에 적합한 수준입니다. 중요한 계정에는 56단어(6478비트)를 사용하십시오.

Math.random()을 비밀번호 생성에 써도 되나요?

아닙니다. Math.random()은 암호학적으로 안전하지 않은 의사 난수 생성기입니다. 보안이 중요한 무작위 생성에는 브라우저에서 crypto.getRandomValues(), Node.js에서 crypto.randomBytes()를 사용하십시오.

bcrypt의 cost 파라미터는 보안에 어떤 영향을 주나요?

bcrypt의 cost 파라미터가 1 늘어날 때마다 해싱(따라서 무차별 대입)에 필요한 계산량이 두 배가 됩니다. cost 12는 2¹² = 4,096회 반복을 의미하며, 비밀번호 고유 엔트로피 위에 사실상 12비트의 난이도를 더합니다.

NIST의 2024년 비밀번호 지침에서 무엇이 바뀌었나요?

NIST SP 800-63B는 필수 복잡성 요구(특수 문자 강제, 대소문자 혼용)와 주기적 비밀번호 교체를 폐지했습니다. 새 지침은 더 긴 비밀번호(15자 이상 권장), 유출 비밀번호 데이터베이스 대조, 공백을 포함한 모든 출력 가능 문자 허용을 중시합니다.

핵심 요약

  1. 엔트로피 = L × log₂(R) — 1비트가 늘어날 때마다 필요한 추측 횟수가 두 배가 됩니다.
  2. 길이 > 복잡성 — 문자 집합을 넓히는 것보다 한 글자를 추가하는 쪽이 더 효과적입니다.
  3. 암호학적 API를 사용하십시오crypto.getRandomValues() 또는 crypto.randomBytes()를 쓰고, Math.random()은 절대 쓰지 마십시오.
  4. 비밀번호 관리자 + 무작위 생성 조합이 대부분의 사용자에게 최적입니다.
  5. 서버 측도 중요합니다 — bcrypt나 argon2를 쓰고, MD5로는 절대 저장하지 마십시오.

고엔트로피 비밀번호를 바로 만들어 보시겠습니까? 무작위 비밀번호 생성기는 생성하는 모든 비밀번호에 대해 실시간 엔트로피 분석을 표시합니다.

더 많은 글 살펴보기

개발자용 튜토리얼과 가이드 모음을 확인하세요.

모든 글 둘러보기