개요

argon2 은 키 유도 함수(key derivation function) 의 일종으로 2015년 Password Hashing Competition 에서 우승한 사용자의 암호를 해싱하는데 유용한 알고리즘입니다.


기존의 password hashing 전용 알고리즘인 bcrypt scrypt 는 컴퓨팅 파워가 지금보다 딸리고 GPU 나 전용 ASIC 으로 병렬 계산이 어려운 시대에 설계되었으므로 새로운 알고리즘이 필요합니다.


argon2 는 암호를 해싱하는데 걸리는 시간이나 소요되는 메모리 양을 설정할 수 있게 설계되었으므로 사용하는 목적에 맞게 파라미터 변경으로 적용이 가능하며 3 가지 종류가 있습니다.

Argon2d

더 빠르고 data-depending 메모리 액세스를 사용하므로 비밀 해싱에 덜 적합하고 부 채널 타이밍 공격의 위협이 없는 암호 화폐 및 애플리케이션에 더 적합합니다.

Argon2i

암호 해싱 및 암호 기반 키 유도에 적합한 데이터 독립적 메모리 액세스를 사용합니다. Argon2i는 트레이드 오프 공격으로부터 보호하기 위해 메모리를 더 많이 통과하므로 속도가 느립니다.

Argon2id

argon2i 와 argon2d 와 하이브리드로 data-depending 과 data-independent memory access 를 혼용할 수 있으며 password hashing 과 password 기반 키 유도에 적합합니다.

Python 에서 사용

module 설치

pip 로 argon2 모듈을 설치합니다. 사전에 C 컴파일러(gcc, Visual C++ 등)가 설치되어 있어야 합니다.

pip install argon2-cffi
BASH


사용

argon2 의 PasswordHasher 를 import 해서 사용하면 됩니다.


argon2 의 출력은 다음과 같이 $ 를 구분자로 하는 문자열인데 5개 필드의 의미는 다음과 같습니다

 $argon2id$v=19$m=102400,t=2,p=8$5gOwqIw5RgkBdw8HXERMLA$9LGcXSLtnENcOfVt9PTxBg
CODE
  1. 1 번째 필드: "argon2id" → 사용한 argon2 유형을 표시하며 여기서는 argon2id 를 사용합니다.
  2. 2 번째 필드:  "v=19" → 버전을 의미하며 argon2 의 버전이 19입니다.
  3. 3 번째 필드:  "m=102400,t=2,p=8" → memory cost, time cost, parallelism 을 의미하며 memory cost = 102400, time cost = 2, parallelism = 8 입니다.
  4. 4 번째 필드:  base64 로 인코딩된 random salt 값입니다.
  5. 5 번째 필드:  base64 로 인코딩된 hash 값입니다.

PHP 에서 사용

php argon2 로 사용자 password hashing 참고

Ref