Go에서 Argon2 사용: 보안성 향상된 비밀번호 해싱
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인프라/DevOps/보안
대상자
Go 언어를 사용하는 개발자, 보안 중심의 애플리케이션 개발자, 기존 bcrypt를 사용하고 있는 프로젝트 담당자
핵심 요약
- bcrypt 대신 Argon2 사용 이유: GPU/ASIC 기반 공격에 강하고, Argon2id 모드는 타이밍 공격과 하드웨어 공격에 동시에 강함
- Go 구현 방법:
golang.org/x/crypto/argon2
패키지 사용, IDKey 함수로 해싱 수행 - 중요 파라미터:
memory=64MB
,threads=4
,saltLength=16
,keyLength=32
(기본값)
섹션별 세부 요약
1. bcrypt의 한계
- salt와 cost factor로 브루트포스 공격 방어
- GPU/ASIC 기반 공격에 취약 (시간이 지남에 따라 보안성 하락)
2. Argon2의 강점
- Password Hashing Competition(PHC) 우승 알고리즘
- 3가지 모드:
- Argon2d: 하드웨어 공격 방어 강함, 타이밍 공격 취약
- Argon2i: 타이밍 공격 방어, 하드웨어 공격 취약
- Argon2id: 두 모드의 장점 결합 (추천)
3. Go 구현 예시
- salt 생성:
crypto/rand.Read()
사용 - 해싱 함수:
argon2.IDKey(password, salt, time, memory, threads, keyLength)
- 비교 함수:
crypto/subtle.ConstantTimeCompare()
로 타이밍 공격 방어
4. 파라미터 설정
- time: 1회 반복 (기본값)
- memory: 64MB (기본값)
- threads: 4개 (기본값)
- saltLength: 16바이트 (고유성 확보)
결론
- 고정 salt 사용 금지 및 시스템 성능에 맞는 파라미터 조정이 필수적
- Argon2id 모드가 보안과 효율성 모두에서 최적의 선택
- Go 패키지를 활용해 기존 bcrypt 프로젝트에서 쉽게 교체 가능