개요
PBKDF2(Password-Based Key Derivation Function 2)는 비밀번호 기반 키 도출 함수(PBKDF)의 한 형태로, 암호화 시스템에서 약한 사용자 비밀번호를 더 강력하고 안전한 암호화 키로 변환하기 위해 설계된 알고리즘입니다. 이 함수는 PKCS #5 v2.0(Public-Key Cryptography Standards #5) 표준에 정의되어 있으며, 암호학적으로 안정적인 의사난수함수(PRF)를 기반으로 반복적인 해시 연산을 수행함으로써 공격자의 무차별 대입 공격(Brute-force Attack) 및 사전 공격(Dictionary Attack)을 어렵게 만듭니다.
PBKDF2는 오늘날 널리 사용되는 암호화 시스템, 예를 들어 와이파이(WPA2), 암호 관리자, 디스크 암호화 도구 등에서 비밀번호 기반 키 생성에 핵심적으로 활용됩니다.
작동 원리
PBKDF2는 주어진 비밀번호(패스워드), 솔트(salt), 반복 횟수(iteration count), 그리고 원하는 키 길이를 입력으로 받아, 암호학적으로 안전한 키를 출력합니다. 주요 구성 요소는 다음과 같습니다.
입력 매개변수
| 매개변수 |
설명 |
비밀번호 |
사용자가 입력한 암호 문자열. 보통 약한 entropy를 가짐. |
솔트(Salt) |
무작위로 생성된 바이트 배열. 동일한 비밀번호라도 다른 솔트를 사용하면 다른 키가 생성됨. |
반복 횟수 |
해시 함수를 반복 적용하는 횟수. 보안성을 높이기 위해 수만 ~ 수십만 회 이상 사용. |
키 길이 |
생성할 도출 키의 길이(바이트 단위). |
알고리즘 절차
PBKDF2는 기본적으로 의사난수함수(PRF)를 반복적으로 적용하여 키를 도출합니다. 일반적으로 HMAC을 PRF로 사용하며, 해시 함수로는 SHA-1, SHA-256 등이 선택됩니다.
- 입력된 비밀번호와 솔트를 사용해 HMAC을 계산합니다.
- 이 결과를 다시 입력으로 하여 반복 횟수만큼 연속적으로 해시 연산을 수행합니다.
- 최종 출력값을 원하는 길이로 잘라내어 키로 사용합니다.
수식적으로 표현하면 다음과 같습니다:
DK = PBKDF2(PRF, 비밀번호, 솔트, 반복횟수, 키길이)
여기서 DK는 도출된 키(Derived Key)를 의미합니다.
보안 특성
솔트의 역할
솔트는 각 사용자의 비밀번호에 고유한 무작위 값을 추가함으로써 레인보우 테이블(Rainbow Table) 공격을 방지합니다. 동일한 비밀번호를 사용하더라도 솔트가 다르면 도출된 키가 달라지므로, 공격자가 미리 계산한 해시 값을 재사용할 수 없습니다.
반복 횟수의 중요성
반복 횟수는 계산 난이도를 인위적으로 증가시켜, 공격자가 무차별 대입을 시도할 때 시간적 비용을 크게 만듭니다. 예를 들어, 반복 횟수를 100,000회로 설정하면, 공격자는 각 비밀번호 시도마다 10만 번의 해시 연산을 수행해야 하므로 공격 속도가 크게 저하됩니다.
권장 반복 횟수: 2020년대 기준으로 최소 100,000회 이상이 권장되며, 시스템 성능과 보안 요구 사항에 따라 조정됩니다.
장단점
장점
- 표준화 및 널리 채택: PKCS #5 및 NIST에서 승인된 표준 알고리즘으로, 다양한 플랫폼과 라이브러리에서 지원됩니다.
- 단순하고 검증됨: 오랜 기간 동안 광범위하게 사용되어 왔으며, 중대한 암호학적 약점이 발견되지 않았습니다.
- 조정 가능한 보안 수준: 반복 횟수를 조절함으로써 보안과 성능 사이의 균형을 맞출 수 있습니다.
단점
- 메모리 사용 최소화: PBKDF2는 계산 집약적일 뿐만 아니라 메모리 집약적이지 않아, ASIC이나 GPU 기반 공격에 취약할 수 있습니다.
- 최신 알고리즘 대비 상대적 열세: bcrypt, scrypt, Argon2와 같은 최신 키 도출 함수는 메모리 및 병렬화 공격에 더 강한 저항력을 제공합니다.
사용 사례
- 디스크 암호화: TrueCrypt, VeraCrypt 등에서 비밀번호 기반 마스터 키 생성에 사용.
- 와이파이 보안: WPA2-Personal에서 PSK(Pre-Shared Key) 생성 시 활용.
- 암호 관리자: LastPass, KeePass 등에서 마스터 비밀번호로부터 암호화 키를 도출.
- 웹 애플리케이션: 사용자 비밀번호를 저장할 때 해시화 과정에 포함 (단, 최근에는 더 나은 대안 권장).
관련 알고리즘 비교
| 알고리즘 |
계산 난이도 |
메모리 난이도 |
병렬화 저항 |
비고 |
| PBKDF2 |
높음 |
낮음 |
낮음 |
표준화, 단순함 |
| bcrypt |
높음 |
중간 |
중간 |
OpenBSD에서 개발 |
| scrypt |
높음 |
높음 |
높음 |
메모리 집약적 |
| Argon2 |
높음 |
높음 |
높음 |
PHC 우승 알고리즘 |
Argon2는 2015년 암호화 키 도출 함수 경연(PHC)에서 우승한 알고리즘으로, 현재 가장 강력한 대안으로 권장됩니다.
참고 자료
관련 문서
# PBKDF2
## 개요
**PBKDF2**(Password-Based Key Derivation Function 2)는 비밀번호 기반 키 도출 함수(PBKDF)의 한 형태로, 암호화 시스템에서 약한 사용자 비밀번호를 더 강력하고 안전한 암호화 키로 변환하기 위해 설계된 알고리즘입니다. 이 함수는 **PKCS #5 v2.0**(Public-Key Cryptography Standards #5) 표준에 정의되어 있으며, 암호학적으로 안정적인 의사난수함수(PRF)를 기반으로 반복적인 해시 연산을 수행함으로써 공격자의 무차별 대입 공격(Brute-force Attack) 및 사전 공격(Dictionary Attack)을 어렵게 만듭니다.
PBKDF2는 오늘날 널리 사용되는 암호화 시스템, 예를 들어 와이파이(WPA2), 암호 관리자, 디스크 암호화 도구 등에서 비밀번호 기반 키 생성에 핵심적으로 활용됩니다.
---
## 작동 원리
PBKDF2는 주어진 비밀번호(패스워드), 솔트(salt), 반복 횟수(iteration count), 그리고 원하는 키 길이를 입력으로 받아, 암호학적으로 안전한 키를 출력합니다. 주요 구성 요소는 다음과 같습니다.
### 입력 매개변수
| 매개변수 | 설명 |
|---------|------|
| `비밀번호` | 사용자가 입력한 암호 문자열. 보통 약한 entropy를 가짐. |
| `솔트(Salt)` | 무작위로 생성된 바이트 배열. 동일한 비밀번호라도 다른 솔트를 사용하면 다른 키가 생성됨. |
| `반복 횟수` | 해시 함수를 반복 적용하는 횟수. 보안성을 높이기 위해 수만 ~ 수십만 회 이상 사용. |
| `키 길이` | 생성할 도출 키의 길이(바이트 단위). |
### 알고리즘 절차
PBKDF2는 기본적으로 의사난수함수(PRF)를 반복적으로 적용하여 키를 도출합니다. 일반적으로 HMAC을 PRF로 사용하며, 해시 함수로는 SHA-1, SHA-256 등이 선택됩니다.
1. 입력된 비밀번호와 솔트를 사용해 HMAC을 계산합니다.
2. 이 결과를 다시 입력으로 하여 반복 횟수만큼 연속적으로 해시 연산을 수행합니다.
3. 최종 출력값을 원하는 길이로 잘라내어 키로 사용합니다.
수식적으로 표현하면 다음과 같습니다:
```
DK = PBKDF2(PRF, 비밀번호, 솔트, 반복횟수, 키길이)
```
여기서 `DK`는 도출된 키(Derived Key)를 의미합니다.
---
## 보안 특성
### 솔트의 역할
솔트는 각 사용자의 비밀번호에 고유한 무작위 값을 추가함으로써 **레인보우 테이블**(Rainbow Table) 공격을 방지합니다. 동일한 비밀번호를 사용하더라도 솔트가 다르면 도출된 키가 달라지므로, 공격자가 미리 계산한 해시 값을 재사용할 수 없습니다.
### 반복 횟수의 중요성
반복 횟수는 계산 난이도를 인위적으로 증가시켜, 공격자가 무차별 대입을 시도할 때 시간적 비용을 크게 만듭니다. 예를 들어, 반복 횟수를 100,000회로 설정하면, 공격자는 각 비밀번호 시도마다 10만 번의 해시 연산을 수행해야 하므로 공격 속도가 크게 저하됩니다.
> **권장 반복 횟수**: 2020년대 기준으로 최소 **100,000회 이상**이 권장되며, 시스템 성능과 보안 요구 사항에 따라 조정됩니다.
---
## 장단점
### 장점
- **표준화 및 널리 채택**: PKCS #5 및 NIST에서 승인된 표준 알고리즘으로, 다양한 플랫폼과 라이브러리에서 지원됩니다.
- **단순하고 검증됨**: 오랜 기간 동안 광범위하게 사용되어 왔으며, 중대한 암호학적 약점이 발견되지 않았습니다.
- **조정 가능한 보안 수준**: 반복 횟수를 조절함으로써 보안과 성능 사이의 균형을 맞출 수 있습니다.
### 단점
- **메모리 사용 최소화**: PBKDF2는 계산 집약적일 뿐만 아니라 메모리 집약적이지 않아, **ASIC**이나 **GPU 기반 공격**에 취약할 수 있습니다.
- **최신 알고리즘 대비 상대적 열세**: **bcrypt**, **scrypt**, **Argon2**와 같은 최신 키 도출 함수는 메모리 및 병렬화 공격에 더 강한 저항력을 제공합니다.
---
## 사용 사례
- **디스크 암호화**: TrueCrypt, VeraCrypt 등에서 비밀번호 기반 마스터 키 생성에 사용.
- **와이파이 보안**: WPA2-Personal에서 PSK(Pre-Shared Key) 생성 시 활용.
- **암호 관리자**: LastPass, KeePass 등에서 마스터 비밀번호로부터 암호화 키를 도출.
- **웹 애플리케이션**: 사용자 비밀번호를 저장할 때 해시화 과정에 포함 (단, 최근에는 더 나은 대안 권장).
---
## 관련 알고리즘 비교
| 알고리즘 | 계산 난이도 | 메모리 난이도 | 병렬화 저항 | 비고 |
|---------|-------------|----------------|--------------|------|
| PBKDF2 | 높음 | 낮음 | 낮음 | 표준화, 단순함 |
| bcrypt | 높음 | 중간 | 중간 | OpenBSD에서 개발 |
| scrypt | 높음 | 높음 | 높음 | 메모리 집약적 |
| Argon2 | 높음 | 높음 | 높음 | PHC 우승 알고리즘 |
> **Argon2**는 2015년 암호화 키 도출 함수 경연(PHC)에서 우승한 알고리즘으로, 현재 가장 강력한 대안으로 권장됩니다.
---
## 참고 자료
- [RFC 2898 - PKCS #5: Password-Based Cryptography Specification Version 2.0](https://tools.ietf.org/html/rfc2898)
- [NIST Special Publication 800-132 - Recommendation for Password-Based Key Derivation](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf)
- [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
---
## 관련 문서
- [bcrypt](/bcrypt)
- [scrypt](/scrypt)
- [Argon2](/argon2)
- [HMAC](/hmac)
- [솔트(Salt)](/salt)