익명 사용자
로그인하지 않음
토론
기여
계정 만들기
로그인
IT 위키
검색
Argon2id
편집하기 (부분)
IT 위키
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
편집
원본 편집
역사
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
==구체적 동작 과정== 아래는 Argon2id의 동작을 단계별로 정리한 설명이다. 구현 세부는 RFC 9106 및 PHC 사양을 참조해야 한다. # '''초기화 및 H_0 생성''' #* 1. 모든 입력(비밀번호, 솔트, 키, 연관 데이터,매개변수 등)을 길이 표기를 포함한 바이트열로 직렬화한다. #* 2. 직렬화한 값을 Blake2b 기반의 가변 길이 해시 함수로 해싱하여 64바이트(예시) 길이의 초기 해시 H_0를 만든다. H_0는 이후 메모리 블록 생성의 시드 역할을 한다. # '''메모리 구조 할당''' #* 3. 요구된 전체 메모리(m KiB)를 1KiB(1024바이트) 블록 단위로 나눈다. Argon2 내부에서의 기본 블록 크기는 1024바이트이다(블록 당 1024B). 전체 블록 수를 p(병렬성)로 나누어 각 'lane'(행)의 열 수(columnCount, q)를 결정한다. #* 4. 2차원 배열 B[i][j] (i=0..p-1: lane, j=0..q-1: column)을 할당한다. 각 B[i][j]는 1024바이트 블록이다. # '''초기 두 블록 생성(각 lane의 j=0,1)''' #* 5. 각 lane i에 대해 다음을 계산한다: #** 5.1. B[i][0] ← Hash'(H_0 ∥ 0 ∥ i, 1024) #** 5.2. B[i][1] ← Hash'(H_0 ∥ 1 ∥ i, 1024) #* Hash'는 Blake2b를 사용하여 1024바이트 출력을 생성하는 래퍼(필요시 내부 반복을 통해 확장)이다. 이 단계는 모든 lane의 첫 두 블록을 결정한다. # '''블록 생성의 주 루프(패스와 칼럼)''' #* 6. 총 반복 횟수 t(패스 수)만큼 전역 패스를 수행한다. 각 패스는 모든 lane과 모든 column을 처리한다. 각 블록 B[i][j]는 이전 블록들과 특정 인덱스의 블록을 입력으로 하는 내부 압축함수 G를 통해 계산되며, 그 결과가 블록에 저장되거나 XOR(반복 패스에서)으로 결합된다. #* 7. 인덱스 선택 규칙(GetBlockIndexes) — Argon2id의 핵심 #** 7.1. 데이터 독립적 접근(data-independent addressing): 첫 번째 패스(특히 초기 절반 섹션)에서는 주소들이 입력 데이터(비밀번호 등)에 의존하지 않도록 의사난수(예: Blake2b로 생성된 스트림)로 결정된다. 이는 캐시 타이밍과 같은 사이드채널 공격을 완화한다(Argon2i 방식). #** 7.2. 데이터 의존적 접근(data-dependent addressing): 이후 패스에서는 인덱스가 이미 계산된 블록 데이터에 의존하여 결정된다(Argon2d 방식). 이 방식은 시간-메모리 절충 공격을 어렵게 만든다. #** 7.3. Argon2id는 "첫 패스는 데이터 독립적 접근을 사용하고, 이후 패스에서는 데이터 의존적 접근을 사용"하는 하이브리드 정책을 따른다. 이로써 초기 패스에서 사이드채널 저항을 확보하고 전체적으로 TMTO 저항성을 제공한다. #* 8. 압축 함수 G의 동작(요약) #** 8.1. G는 두 개의 1024바이트 입력 블록(예: X, Y)을 받아 내부적으로 BLAKE2b의 내부 순열을 이용하는 라운드 조합을 통해 1024바이트 출력을 생성한다. #** 8.2. 구체적으로는 블록을 여러 64비트 워드(예: 128개의 64비트 워드)로 보고, BLAKE2b의 64비트 연산 스타일을 차용한 혼합/압축 연산(예: ARX 스타일의 덧셈·XOR·회전)을 수행한다. 최종 출력은 하나의 1024바이트 블록이다. #* 9. 블록 저장 규칙(패스별) #** 9.1. 만약 j==0(각 lane의 첫 열)이고 패스 수가 1보다 클 경우, 새로운 값은 이전 패스의 같은 lane 마지막 블록과 선정된 블록을 G로 결합한 뒤 XOR으로 B[i][0]에 합쳐진다. #** 9.2. 그 외의 경우 B[i][j] = G(B[i][j-1], B[i′][j′]) 또는 B[i][j] = B[i][j] xor G(...) 형태로 갱신된다(패스와 RFC 규칙에 따름). # '''최종화 및 태그 생성''' #* 10. 모든 패스가 끝나면 각 lane의 마지막 열(열 q-1)에 있는 블록들을 XOR하여 단일 블록 C를 만든다: C ← B[0][q-1] xor B[1][q-1] xor ... xor B[p-1][q-1]. #* 11. 출력 태그(tag)는 Hash'(C, T) (예: Blake2b 기반 가변 길이 해시)로 계산되어 요구된 바이트 수 T를 반환한다.
요약:
IT 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
IT 위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
둘러보기
둘러보기
대문
최근 바뀜
광고
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록