Argon2
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Argon2는 암호 해싱 및 키 유도에 사용되는 메모리 하드 함수이다. 세 가지 버전(Argon2d, Argon2i, Argon2id)이 있으며, 실행 시간, 사용 가능한 메모리, 병렬 처리 수를 매개변수로 제어할 수 있다. Argon2d는 GPU 공격에 강하고, Argon2i는 사이드 채널 공격에 강하며, Argon2id는 두 공격 모두에 대한 하이브리드 형태이다. Argon2는 Blake2b 해시 함수를 내부적으로 사용하며, 최대 232 바이트 길이의 다이제스트를 생성할 수 있다. RFC9106에서는 사이드 채널 공격 완화를 위해 Argon2id 사용을 권장한다. OWASP는 Argon2id를 사용하고, 최소 19 MiB의 메모리, 반복 횟수 2, 병렬 처리 정도 1의 설정을 권장한다.
더 읽어볼만한 페이지
- 2015년 컴퓨팅 - 스테이지프라이트
스테이지프라이트는 2015년 안드로이드 미디어 재생 엔진에서 발견된 보안 취약점으로, 악성 MMS 메시지를 통해 사용자 개입 없이 기기를 감염시킬 수 있었으며, 구글의 패치 배포에도 불구하고 안드로이드 생태계 단편화로 인해 파급 효과가 컸다. - 2015년 컴퓨팅 - FREAK
FREAK는 1990년대 미국 암호 기술 수출 규제로 발생한 보안 취약점을 이용, 공격자가 암호화 통신을 다운그레이드하여 취약한 암호 알고리즘을 사용하게 만드는 중간자 공격으로, 정보 유출 등의 피해를 초래하며 보안 업데이트와 국제 공조의 중요성을 부각시켰습니다.
| Argon2 | |
|---|---|
| 일반 정보 | |
| 종류 | 비밀번호 기반 키 유도 함수 |
| 설계자 | 알렉스 비류코프, 다니엘 디누, 드미트리 호브라토비치 |
| 발표일 | 2015년 |
| 다이제스트 크기 | 가변적 |
| 블록 크기 | 가변적 |
| 라운드 수 | 가변적 |
| RFC | RFC 9106 |
2. 역사
Argon2는 크리에이티브 커먼즈 CC0 하에 공개되었다. Argon2는 세 가지 버전이 있다.
- Argon2d는 GPU 공격에 강한 내성을 가지고 있다.
- Argon2i는 사이드 채널 공격에 견딜 수 있도록 설계되었다.
- Argon2id는 Argon2i와 Argon2d의 하이브리드로, 사이드 채널 공격과 GPU 공격 모두에 내성을 가지고 있다.
Argon2는 실행 시간, 사용 가능한 메모리 양, 병렬 처리 수 등의 매개변수를 제어할 수 있다.
3. 종류
Argon2는 크리에이티브 커먼즈 CC0 하에 공개되었으며, 다음과 같은 세 가지 버전이 있다.
- Argon2d: GPU 공격에 강한 내성을 가지고 있다.
- Argon2i: 사이드 채널 공격에 견딜 수 있도록 설계되었다.
- Argon2id: Argon2i와 Argon2d의 하이브리드 형태로, 사이드 채널 공격과 GPU 공격 모두에 내성을 가지고 있다.
이 세 가지 버전은 실행 시간, 사용 가능한 메모리 양, 병렬 처리 수와 같은 매개변수를 통해 제어할 수 있다.
3. 1. Argon2d
Argon2d는 데이터 의존적 메모리 접근 방식을 사용한다. GPU 기반 공격 및 트레이드 오프 공격에 대한 높은 저항성을 제공하도록 설계되었다. 비밀번호 해싱보다는 키 유도와 같이 부채널 공격의 위험이 적은 응용 분야에 적합하다.[1]3. 2. Argon2i
Argon2i는 데이터 독립적 메모리 접근 방식을 사용하며, 사이드 채널 공격에 견딜 수 있도록 설계되었다.[1] 순차적 메모리 하드(sequentially memory-hard) 특성을 가지며, 시간-메모리 트레이드 오프 공격을 어렵게 만든다.[1]3. 3. Argon2id
Argon2id는 Argon2i와 Argon2d의 하이브리드 버전으로, 처음 절반의 반복은 Argon2i처럼 데이터 독립적인 메모리 접근을 사용하고, 나머지 절반은 Argon2d처럼 데이터 의존적인 메모리 접근을 사용한다.[9] 이는 사이드 채널 공격과 GPU 기반 공격 모두에 대해 균형 잡힌 저항성을 제공한다. RFC9106은 이러한 공격을 완화하기 위해 Argon2id 사용을 권장한다.[9]4. 알고리즘
Argon2는 다음과 같은 입력 매개변수를 사용한다.
| 매개변수 | 설명 | 값 |
|---|---|---|
| 비밀번호 (P) | 해시할 비밀번호 (또는 메시지) | 0..232-1 바이트 |
| 솔트 (S) | 비밀번호 해싱에는 16바이트를 권장 | 8..232-1 바이트 |
| 병렬성 (p) | 병렬 처리 정도 (스레드 수) | 1..224-1 |
| 태그 길이 (T) | 반환할 바이트 수 | 4..232-1 |
| 메모리 크기 (m) | 사용할 메모리 양 (키비바이트) | 8p..232-1 |
| 반복 횟수 (t) | 수행할 반복 횟수 | 1..232-1 |
| 버전 (v) | 현재 버전은 0x13 (10진수 19) | 숫자, 0x13 |
| 키 (K) | 선택적 키 | 0..232-1 바이트 |
| 연관 데이터 (X) | 선택적 임의의 추가 데이터 | 0..232-1 바이트 |
| 해시 유형 (y) | Argon2d, Argon2i, Argon2id 선택 | Argon2d (0), Argon2i (1), Argon2id (2) |
출력은 태그이며, tagLength 바이트 길이의 생성된 바이트들이다.
Argon2 알고리즘은 다음과 같은 단계를 거친다.
1. 초기 블록 H0 생성: 모든 입력 매개변수를 연결하고, 32비트 리틀 엔디안 정수로 표현된 각 변수의 길이를 앞에 추가하여 Blake2b 해시 함수에 입력하여 64바이트 블록 H0를 생성한다.
2. 메모리 블록 할당: 메모리 크기(m)와 병렬성(p)을 기반으로 1KiB 블록의 2차원 배열(병렬성 행 x columnCount 열)을 할당한다. 여기서 columnCount는 `memorySizeKB`를 4\*`parallelism`의 가장 가까운 배수로 내림한 값을 `parallelism`으로 나눈 값이다.
3. 초기 블록 계산: 각 레인(행)의 첫 번째 두 블록(열 0과 1)을 계산한다. H0와 인덱스를 이용하여 1024바이트 해시를 생성한다.
4. 나머지 블록 계산: 각 레인의 나머지 블록(열 2부터)을 계산한다. 이때, Argon2i, Argon2d, Argon2id에 따라 다른 인덱스(i', j')를 사용하여 이전 블록과 참조 블록을 선택하고, 이를 기반으로 G 함수를 적용하여 새로운 블록을 생성한다. (G 함수와 GetBlockIndexes 함수는 정의되어 있지 않음)
5. 반복: 반복 횟수(t)가 1보다 크면, 위 과정을 반복한다. 이때, 각 반복마다 이전 단계에서 계산된 블록들을 XOR 연산하여 새로운 블록을 생성한다.
6. 최종 블록 계산: 각 레인의 마지막 열에 있는 블록들을 모두 XOR 연산하여 최종 블록 C를 계산한다.
7. 출력 태그 생성: 최종 블록 C를 Blake2b 해시 함수에 입력하여 지정된 태그 길이(T)만큼의 해시값을 생성한다.
Argon2는 세 가지 버전이 제공된다.
- Argon2d: GPU 공격에 대한 내성을 강화한 버전이다.
- Argon2i: 사이드 채널 공격에 견딜 수 있도록 설계된 버전이다.
- Argon2id: Argon2i와 Argon2d의 하이브리드 버전으로, 사이드 채널 공격과 GPU 공격 모두에 대한 내성을 제공한다.
4. 1. 가변 길이 해시 함수
Argon2는 내부적으로 Blake2b 해시 함수를 사용하여 가변 길이 해시를 생성한다. 요청된 해시 길이(`tagLength`)에 따라 다음과 같이 작동한다.- `tagLength`가 64바이트 이하인 경우: Blake2b를 직접 사용하여 해시를 생성한다. 이때, 32비트 리틀 엔디안 형식의 `tagLength` 값을 메시지 바이트와 연결하여 Blake2b에 입력한다.
- `tagLength`가 64바이트를 초과하는 경우:
1. 필요한 64바이트 블록 수를 계산한다. (`r` = Ceil(`tagLength`/32) - 2)
2. Blake2b를 반복적으로 호출하여 `r`개의 64바이트 블록(V1 ~ Vr)을 생성한다. 첫 번째 블록(V1)은 `tagLength`와 메시지를 연결한 값을 입력으로 사용하고, 이후 블록(Vi)은 이전 블록(Vi-1)을 입력으로 사용한다.
3. 마지막 블록(Vr+1)은 `tagLength`에서 이미 생성된 블록들의 길이를 뺀 나머지 바이트 수만큼만 생성한다.
4. 각 블록(V1 ~ Vr)의 처음 32바이트를 연결하고, 마지막 블록(Vr+1) 전체를 연결하여 최종 해시값을 생성한다.
5. 암호 해독
현재 Argon2d에 적용 가능한 공개된 암호 분석은 없지만, Argon2i 함수에 대한 두 가지 공격이 발표되었다. 첫 번째 공격은 이전 버전의 Argon2i에만 적용 가능하며, 두 번째 공격은 최신 버전(1.3)으로 확장되었다.
첫 번째 공격은 원하는 공간의 4분의 1에서 5분의 1 사이의 공간을 사용하여 시간 손실 없이 단일 패스 Argon2i 함수를 계산하고, N/e (≈ N/2.72) 공간만을 사용하여 시간 손실 없이 다중 패스 Argon2i를 계산할 수 있음을 보여준다.[5] Argon2의 저자에 따르면, 이 공격 벡터는 버전 1.3에서 수정되었다.[6]
두 번째 공격은 Argon2i가 모든 매개변수 σ (공간 비용), τ (시간 비용), 그리고 n=σ∗τ를 만족하는 스레드 수에 대해 O(n7/4 log(n))의 복잡성을 가진 알고리즘으로 계산될 수 있음을 보여준다.[7] Argon2의 저자는 이 공격이 Argon2i가 세 번 이상의 패스로 사용되는 경우 효율적이지 않다고 주장한다.[6] 그러나 Joël Alwen과 Jeremiah Blocki는 공격을 개선하여 공격이 실패하려면 Argon2i v1.3이 메모리에 10번 이상의 패스가 필요함을 보였다.[8]
이러한 우려 사항을 해결하기 위해, RFC9106은 이러한 공격을 크게 완화하기 위해 Argon2id를 사용할 것을 권장한다.[9]
6. 권장 매개변수
OWASP는 2023년 5월 기준으로 "19 MiB의 메모리, 반복 횟수 2, 병렬 처리 정도 1의 최소 구성으로 Argon2id를 사용"할 것을 권장한다.[10]
OWASP는 GPU 기반 공격과 부채널 공격에 대한 균형 잡힌 저항성을 제공하기 때문에 Argon2d와 Argon2i보다 Argon2id를 선호해야 한다고 권장한다.[10]
OWASP는 또한 다음 Argon2id 옵션이 동일한 암호 강도를 제공하며 메모리 사용량과 컴퓨팅 작업 부하를 단순히 상쇄한다고 언급한다.[10]
| 메모리 | 반복 횟수 | 병렬 처리 |
|---|---|---|
| 46 MiB | 1 | 1 |
| 19 MiB | 2 | 1 |
| 12 MiB | 3 | 1 |
| 9 MiB | 4 | 1 |
| 7 MiB | 5 | 1 |
참조
[1]
웹사이트
Password Hashing Competition
https://password-has[...]
[2]
논문
Open Sesame: The Password Hashing Competition and Argon2
2016-02-08
[3]
간행물
Argon2: the memory-hard function for password hashing and other applications
https://password-has[...]
2015-10-01
[4]
웹사이트
Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications
https://www.rfc-edit[...]
2021-09-01
[5]
보고서
Balloon Hashing: Provably Space-Hard Hash Functions with Data-Independent Access Patterns
https://eprint.iacr.[...]
2016-01-14
[6]
웹사이트
"[Cfrg] Argon2 v.1.3"
https://www.ietf.org[...]
2016-10-30
[7]
보고서
Efficiently Computing Data-Independent Memory-Hard Functions
https://eprint.iacr.[...]
2016-02-19
[8]
보고서
Towards Practical Attacks on Argon2i and Balloon Hashing
https://eprint.iacr.[...]
2016-08-05
[9]
IETF
Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications
IETF
2021-09-01
[10]
웹사이트
Password Storage Cheat Sheet
https://cheatsheetse[...]
OWASP
2023-05-17
[11]
웹사이트
Password Hashing Competition
https://password-has[...]
[12]
논문
Open Sesame: The Password Hashing Competition and Argon2
https://eprint.iacr.[...]
2016-02-08
[13]
간행물
Argon2: the memory-hard function for password hashing and other applications
https://password-has[...]
2015-10-01
[14]
논문
Balloon Hashing: Provably Space-Hard Hash Functions with Data-Independent Access Patterns
https://eprint.iacr.[...]
2016-01-14
[15]
웹사이트
"[Cfrg] Argon2 v.1.3"
https://www.ietf.org[...]
2016-10-30
[16]
논문
Efficiently Computing Data-Independent Memory-Hard Functions
https://eprint.iacr.[...]
2016-02-19
[17]
논문
Towards Practical Attacks on Argon2i and Balloon Hashing
https://eprint.iacr.[...]
2016-08-05
[18]
웹사이트
Blocki and Alwen's second attack #182
https://github.com/P[...]
2016-12-29
[19]
웹사이트
Password Hashing Competition
https://password-has[...]
[20]
ArXiv
Open Sesame: The Password Hashing Competition and Argon2
https://eprint.iacr.[...]
2016-02-08
[21]
간행물
Argon2: the memory-hard function for password hashing and other applications
https://password-has[...]
2015-10-01
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com