패스워드 해싱 표준: MD5와 SHA-256이 충분하지 않은 이유
개발자로서 여러분의 가장 중요한 책임 중 하나는 사용자 패스워드를 보호하는 것입니다. 패스워드를 평문으로 저장하는 것은 당연히 재앙이지만, 여전히 많은 개발자가 MD5나 SHA-256 같은 '빠른' 암호화 해시를 패스워드 저장에 사용하는 실수를 범하고 있습니다.
이 가이드에서는 왜 그러한 방식이 취약한지, 그리고 안전한 패스워드 해싱을 위한 현재의 업계 표준은 무엇인지 설명합니다.
1. '빠른' 해시의 문제점
MD5, SHA-1, SHA-256 같은 알고리즘은 빠르게 작동하도록 설계되었습니다. 이들은 대용량 파일의 무결성을 수 밀리초 안에 확인하기 위한 용도입니다.
파일 검사에는 속도가 장점이지만, 패스워드에는 치명적인 단점이 됩니다. 현대의 GPU는 초당 수십억 개의 SHA-256 해시를 계산할 수 있습니다. 만약 공격자가 SHA-256으로 해싱된 패스워드 데이터베이스를 탈취한다면, 무차별 대입(Brute-force) 공격을 통해 불과 몇 시간 만에 거의 모든 단순한 패스워드를 찾아낼 수 있습니다.
2. 현대적인 느린 해싱 알고리즘
무차별 대입 공격을 무력화하기 위해, 우리는 의도적으로 계산 비용이 많이 들도록 설계된 알고리즘을 사용합니다. 이를 '적응형' 해시라고 하며, 하드웨어가 빨라짐에 따라 '작업 계수(Work Factor)'를 높일 수 있습니다.
Argon2: 골드 표준
Argon2는 2015년 패스워드 해싱 대회(Password Hashing Competition)에서 우승했으며, 현재 OWASP와 NIST에서 권장하는 표준입니다.
- Argon2id: 권장되는 변체입니다. GPU 기반 공격과 사이드 채널 공격 모두에 저항력이 있습니다.
- 설정 가능: 메모리 사용량, 반복 횟수, 병렬성을 조정하여 서버에서 패스워드 하나를 해싱하는 데 약 500ms가 걸리도록 맞춤 설정할 수 있습니다.
bcrypt: 검증된 클래식
1999년에 개발된 bcrypt는 역사상 가장 널리 사용되고 신뢰받는 알고리즘 중 하나입니다.
- 작업 계수: '비용(cost)' 매개변수를 사용합니다. 이 값을 1씩 높일 때마다 패스워드 해싱에 걸리는 시간이 두 배로 늘어납니다.
- 여전히 안전함: 오래되었음에도 불구하고 bcrypt는 현대의 공격에 대해 여전히 매우 안전합니다.
scrypt: 메모리 하드(Memory-Hard)의 선구자
scrypt는 '메모리 하드성'을 도입한 첫 번째 주요 알고리즘입니다. 계산에 상당한 양의 RAM이 필요하므로, 공격자가 전용 해킹 하드웨어(ASIC)를 구축하는 비용을 극도로 높입니다.
3. 알고리즘 그 이상: 솔트와 페퍼
강력한 알고리즘을 사용하더라도 추가적인 보호 계층이 필요합니다.
솔트 (Salt): 레인보우 테이블 무력화
솔트는 해싱 전 패스워드에 추가되는 무작위 문자열입니다.
- 이유: 솔트가 없다면, 두 사용자가 같은 패스워드('password123')를 쓸 경우 해시값도 같아집니다. 공격자는 '레인보우 테이블(미리 계산된 해시 목록)'을 사용하여 즉시 이를 해독할 수 있습니다.
- 원칙: 모든 사용자는 계정 생성 시 생성된 고유하고 무작위인 솔트를 가져야 합니다.
페퍼 (Pepper): 비밀 계층
페퍼는 솔트와 비슷하지만, 데이터베이스가 아닌 안전한 설정 파일이나 하드웨어 보안 모듈(HSM)에 저장됩니다.
- 이유: 공격자가 데이터베이스를 탈취하더라도 애플리케이션의 비밀 키(페퍼)를 모른다면 해시를 해독할 수 없습니다.
4. 개발자를 위한 베스트 프랙티스
- MD5나 SHA-1은 절대 금지: 보안 용도로는 완전히 무너졌습니다.
- 단순 SHA-256 피하기: 너무 빨라서 GPU로 쉽게 뚫립니다.
- Argon2id 또는 bcrypt 선택: 신규 프로젝트에는 Argon2id를 권장하며, bcrypt는 라이브러리 지원이 매우 뛰어난 대안입니다.
- 작업 계수 조정: 해싱 시간이 250ms에서 500ms 사이가 되도록 설정하세요. 사용자가 로그인을 기다리기엔 충분히 빠르면서 공격자를 막기엔 충분히 느린 속도입니다.
- 항상 솔트 사용: Node.js나 Python의
bcrypt라이브러리 등 대부분의 현대적인 라이브러리는 솔트 처리를 자동으로 수행합니다.
요약 비교
| 알고리즘 | 유형 | 메모리 하드 | 권장 여부 |
|---|---|---|---|
| MD5 | 빠른 해시 | 아니오 | ❌ 절대 금지 |
| SHA-256 | 빠른 해시 | 아니오 | ❌ 부적합 (패스워드용) |
| PBKDF2 | 느린 해시 | 아니오 | ⚠️ 레거시 전용 |
| bcrypt | 느린 해시 | 아니오 | ✅ 권장 |
| scrypt | 느린 해시 | 예 | ✅ 권장 |
| Argon2id | 느린 해시 | 예 | 🏆 최고 |
결론
패스워드 보호는 단순히 무작위 알고리즘을 선택하는 것이 아니라, 현대 하드웨어의 위력에 저항할 수 있도록 설계된 도구를 사용하는 것입니다. 적절한 솔트와 작업 계수를 갖춘 Argon2id를 사용함으로써, 여러분은 사용자에게 현재 가능한 최고 수준의 보안을 제공할 수 있습니다.
해시를 테스트하거나 개인 계정을 위한 안전한 패스워드를 생성하고 싶으신가요? 저희의 패스워드 생성기 도구와 해시 생성기를 사용하여 데이터를 안전하게 보호하세요.