키 파생 함수: PBKDF2, bcrypt 및 Argon2
GPU 및 ASIC 공격에 대한 저항성을 기준으로 비밀번호 해싱 알고리즘을 비교하고 작업량 요소와 메모리 경도를 조정하는 방식을 이해합니다.
키 파생 함수: PBKDF2, bcrypt 및 Argon2은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
비밀번호 해싱은 왜 다른가
비밀번호를 저장하려면 비밀번호 해싱 함수(PHF) 또는 키 파생 함수(KDF)라고 하는 특수한 암호화 함수가 필요합니다. SHA-256과 같은 일반 암호화 해시는 빠르게 동작하도록 설계되었습니다. 최신 GPU는 초당 수십억 개의 SHA-256 해시를 계산할 수 있습니다. 이러한 속도는 비밀번호 저장에 치명적입니다. 공격자가 해시 데이터베이스를 훔치면 초당 수십억 번의 추측을 시도할 수 있기 때문입니다. 비밀번호 KDF는 의도적으로 느리게 설계되며, 무차별 대입 공격을 계산상 실행하기 어렵게 만들면서도 정상적인 로그인을 밀리초 단위로 처리할 수 있도록 조정됩니다.
솔트 적용: 레인보 테이블 무력화
전용 비밀번호 KDF가 등장하기 전에는 공격자가 해시 값에서 평문 비밀번호로 거슬러 올라가는 사전 계산 매핑인 레인보 테이블을 사용했습니다. 솔트는 해시하기 전에 비밀번호 앞이나 뒤에 추가하는 사용자별 무작위 값입니다. 동일한 비밀번호라도 해시가 모두 달라집니다. 솔트는 해시와 함께 데이터베이스에 저장하며 비밀이 아니라 무작위 값일 뿐입니다. 적절한 솔트는 최소 16바이트이고, 암호학적으로 안전한 난수 생성기로 생성되며, 사용자별로 저장되어야 합니다(계정 간에 절대 재사용하지 않음).
PBKDF2: 비밀번호 표준
PBKDF2(Password-Based Key Derivation Function 2)는 RFC 8018에 정의되어 있으며 NIST의 승인을 받았습니다. 일반적으로 HMAC-SHA-256인 HMAC 함수를 비밀번호와 솔트에 설정 가능한 반복 횟수만큼 반복 적용합니다. 반복 횟수는 작업량을 결정하는 요소입니다. NIST는 2023년 기준으로 PBKDF2-HMAC-SHA256을 최소 600,000회 반복할 것을 권장합니다. PBKDF2는 널리 사용되지만(Django, iOS Keychain, WPA2-PSK), GPU에서 효율적으로 구현할 수 있다는 약점이 있어 다른 대안보다 GPU 공격에 덜 강합니다.
# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
# 'sha256', # hash algorithm
# b'password', # password bytes
# b'random_salt', # salt bytes
# 600000 # iterations
# )bcrypt: 메모리 및 CPU 저항성
bcrypt는 1999년에 Niels Provos와 David Mazieres가 설계했으며 현재도 널리 사용됩니다. 핵심적인 특징은 비용 계수(라운드 매개변수)입니다. 값이 1 증가할 때마다 계산 시간이 두 배로 늘어납니다. bcrypt는 수정된 Blowfish 암호와 Eksblowfish 키 설정을 사용합니다. 이 과정은 CPU와 메모리를 모두 많이 사용하므로 PBKDF2에 비해 GPU로 가속하기가 훨씬 어렵습니다. 또한 bcrypt는 비밀번호 입력을 72바이트로 제한하므로 더 긴 비밀번호는 잘립니다. 따라서 일부 구현에서는 긴 비밀번호를 먼저 SHA-256으로 해시해야 합니다.
# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username passwordArgon2: 현대적인 최선의 선택
Argon2는 2015년 Password Hashing Competition에서 우승했으며 현재 OWASP가 권장하는 방식입니다. 세 가지 변형이 있습니다. Argon2d는 더 빠르지만 부채널에 취약해 암호화폐에 적합하고, Argon2i는 일정한 시간에 실행되어 비밀번호 해싱에 적합하며, Argon2id는 두 방식을 결합한 형태로 대부분의 용도에 권장됩니다. Argon2id는 시간 비용(반복 횟수), 메모리 비용(필요한 RAM), 병렬성(스레드 수)이라는 세 가지 기준으로 조정할 수 있습니다. 높은 메모리 요구량 때문에 GPU에서 병렬화하기가 매우 어렵고 ASIC에서는 사실상 실행이 불가능합니다.
# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32메모리 집약성: GPU 공격을 무력화하는 이유
GPU에는 수천 개의 코어가 있지만 코어당 메모리는 제한되어 있어, 단순하고 메모리를 적게 사용하는 계산을 병렬화하는 데 적합합니다. Argon2와 scrypt 같은 메모리 집약 함수는 각 해시 계산에 많은 RAM을 요구합니다. 공격자가 각각 64MB의 메모리를 필요로 하는 Argon2id 계산 10,000개를 병렬로 실행하려면 GPU RAM 640GB가 필요합니다. 이는 어떤 GPU 클러스터가 보유할 수 있는 용량도 훨씬 초과합니다. 메모리 집약성이라고 하는 이 특성은 공격자가 느린 순차 계산을 사용하거나 공격을 비경제적으로 만드는 막대한 하드웨어 비용을 감수하도록 강제합니다.
실제 작업량 조정
적절한 작업량은 하드웨어와 허용 가능한 지연 시간에 따라 달라집니다. 일반적인 목표는 인증 1회마다 서버의 운영 하드웨어에서 100~300ms가 걸리도록 하는 것입니다. 하드웨어가 향상되면 작업량을 늘려야 합니다. 이것이 bcrypt와 Argon2가 해시와 함께 매개변수를 저장하는 이유이며, 이를 통해 투명한 업그레이드가 가능합니다. 다음 로그인 시 비밀번호를 확인한 후 새롭고 더 높은 매개변수로 다시 해시하면 됩니다. OWASP는 PBKDF2, bcrypt, Argon2id에 대한 최신 권장 최소 매개변수를 관리하며, 이를 매년 검토해야 합니다.
scrypt: 또 다른 메모리 집약 KDF
scrypt는 2009년에 Colin Percival이 설계했으며, 널리 채택된 최초의 메모리 집약 KDF로 Litecoin과 많은 비밀번호 관리자에서 사용됩니다. scrypt는 N(CPU/메모리 비용), r(블록 크기), p(병렬화 계수)로 매개변수화됩니다. Argon2와 마찬가지로 높은 N 값은 각 계산에 많은 RAM을 요구합니다. scrypt는 안전한 것으로 간주되지만, Argon2id는 PHC에서 우승했고 더 많은 암호학적 분석을 거쳤기 때문에 일반적으로 새 애플리케이션에 더 선호됩니다. 두 방식 모두 적절한 선택입니다.
사용하면 안 되는 것: MD5, SHA-1, 솔트 없는 SHA
다음과 같은 여러 해싱 방식은 비밀번호에 절대 사용해서는 안 됩니다. MD5(취약하며 일반 소비자 하드웨어에서 초당 수십억 개의 해시 계산 가능), SHA-1(동일한 문제), 솔트 없는 SHA-256(빠르고 레인보 테이블을 쉽게 사용할 수 있음), 단순 암호화(되돌릴 수 있어 키를 탈취하면 모든 비밀번호가 노출됨)입니다. LinkedIn (2012)과 같은 과거 침해 사고에서는 솔트 없는 SHA-1을 사용해 1억 1,700만 개의 비밀번호가 노출되었고 며칠 만에 해독되었습니다. Adobe (2013)는 비밀번호를 해시하지 않고 암호화했습니다. 이는 근본적인 오해였으며 1억 5,300만 개의 계정이 노출되었습니다. 이러한 사건은 Security+ 시험 출제 범위에 포함됩니다.
암호화 키를 위한 키 파생
KDF는 비밀번호 해시를 저장하는 대신 비밀번호에서 암호화 키를 파생하는 데에도 사용됩니다. 사용자가 암호화된 보관함의 주 비밀번호를 설정하면 애플리케이션은 KDF를 사용해 해당 비밀번호에서 실제 AES-256 암호화 키를 파생합니다. 비밀번호 관리자가 로컬에서 보관함을 복호화할 수 있는 이유가 바로 여기에 있습니다. 비밀번호 관리자는 주 비밀번호에 KDF를 실행해 암호화 키를 재구성하며, 이 키는 기기 밖으로 전송되지 않습니다. HKDF(HMAC 기반 키 파생 함수)는 하나의 엔트로피가 높은 비밀 값에서 여러 키를 파생하는 표준이며, TLS 1.3에서 핸드셰이크 키와 애플리케이션 키를 파생하는 데 사용됩니다.
자격 증명 스터핑과 KDF 보호
자격 증명 스터핑 공격은 한 침해 사고에서 탈취한 사용자 이름과 비밀번호 조합을 다른 서비스에서도 재사용합니다. 강력한 KDF는 침해 사고 이후 오프라인 크래킹에 걸리는 시간을 늘립니다. 공격자가 추측 한 번에 마이크로초가 아니라 300ms를 소비해야 한다면, 무작위로 생성된 10자 비밀번호를 크래킹하는 일은 계산적으로 불가능해집니다. 그러나 KDF는 사이트 간 비밀번호 재사용을 막지 못합니다. 이를 해결하려면 사용자가 사이트마다 고유한 비밀번호를 사용해야 합니다. 고유한 비밀번호 + Argon2id 저장 + MFA를 조합하면 자격 증명 기반 공격은 사실상 무력화됩니다.
빠른 확인
이 단원에서 배운 CompTIA Security+ (SY0-701) 개념을 이해했는지 확인해 보세요.
단원 요약
이 단원에서는 다음을 배웠습니다. 비밀번호 KDF는 의도적으로 느리게 설계되며 조정 가능한 작업 인자를 사용해 오프라인 무차별 대입 공격을 계산적으로 불가능하게 만듭니다. 또한 Argon2id와 scrypt 같은 메모리 집약형 함수는 계산마다 많은 RAM을 요구하여 GPU 병렬화를 무력화합니다. 그리고 여러 차례의 대규모 침해 사고에서 확인되었듯이 MD5, SHA-1 및 솔트가 없는 해시는 비밀번호 저장에 완전히 부적합합니다. 다음에는 RSA와 ECC를 대체하기 위해 NIST가 선정한 알고리즘과 양자 내성 암호를 살펴보겠습니다.
자주 묻는 질문
“키 파생 함수: PBKDF2, bcrypt 및 Argon2” 강의는 무료인가요?
네 — “키 파생 함수: PBKDF2, bcrypt 및 Argon2” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“키 파생 함수: PBKDF2, bcrypt 및 Argon2”에서 뭘 배우나요?
GPU 및 ASIC 공격에 대한 저항성을 기준으로 비밀번호 해싱 알고리즘을 비교하고 작업량 요소와 메모리 경도를 조정하는 방식을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“키 파생 함수: PBKDF2, bcrypt 및 Argon2” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- TLS 1.3 핸드셰이크 및 0-RTT 재개
- 인증된 암호화: AES-GCM 및 ChaCha20-Poly1305
- 키 파생 함수: PBKDF2, bcrypt 및 Argon2
- 포스트 양자 암호: CRYSTALS-Kyber 및 Dilithium