블록체인/레벨 II · 작동 원리/2.1 암호학/수업 1
해시 함수와 SHA-256
원장을 고정하는 지문
준비물shasum 또는 openssl이 설치된 터미널온라인 SHA-256 계산기한 글자만 다른 텍스트 파일 두 개
호기심
- 파일에서 한 글자만 바꿔도 왜 해시의 약 절반이 바뀔까요?
- 가능한 입력은 끝없이 많은데 출력은 유한한 집합을 공유한다면, 충돌하는 두 입력을 찾는 것이 왜 여전히 사실상 불가능할까요?
- 전신인 SHA-1이 깨졌을 때 SHA-256은 무엇 덕분에 안전했을까요?
탐구
- 암호학적 해시 함수는 임의 길이의 데이터를 고정 크기의 다이제스트로 변환합니다. 이 함수는 결정론적이어서 같은 입력에는 항상 동일한 출력이 나옵니다. 계산은 빠르지만 역산은 사실상 불가능합니다. 이러한 일방향성이 역상 저항성(preimage resistance)을 정의합니다. 공격자가 해시만 가지고 있다면 원래 메시지를 알아낼 수 없습니다. 이러한 비가역성은 분산 시스템 전반에서 무결성 검사와 신원 증명을 안전하게 지켜 줍니다.
- SHA-256은 입력 크기와 상관없이 256비트의 출력을 생성합니다. 입력이 1바이트든 기가바이트급 파일이든 다이제스트는 항상 정확히 32바이트입니다. 이 고정된 길이 덕분에 일관된 저장과 비교가 가능합니다. 이 함수는 데이터를 512비트 블록 단위로 64라운드의 논리 연산을 거쳐 처리합니다. 설계는 블록들에 걸쳐 압축 함수를 연쇄적으로 적용하는 Merkle–Damgård 구조를 따르며, 출력을 뒤섞는 것은 바로 이 압축 함수의 혼합 과정입니다.
- 눈사태 효과(avalanche effect)는 매우 중요한 특징입니다. 입력의 비트 하나만 뒤집혀도 출력 해시의 비트 중 약 절반이 바뀝니다. 이러한 민감성 덕분에 아주 사소한 데이터 손상이나 조작도 완전히 다른 다이제스트를 낳습니다. 그래서 해시 함수는 파일 무결성을 검증하고 변경 여부를 탐지하는 데 이상적입니다. 아무리 미세한 수정이라도 예상 해시와 계산된 해시의 일치를 깨뜨립니다.
- 충돌 저항성은 가장 까다로운 요건입니다. 생일 한계(birthday bound) 때문에, 같은 해시를 만드는 서로 다른 두 입력을 찾으려면 약 2^128번의 연산이 필요합니다. SHA-256의 경우 이 계산 비용 때문에 현재 하드웨어로는 브루트포스 공격이 비현실적입니다. 반면 SHA-1은 2017년 구글과 CWI 연구진이 시연한 SHAttered라는 실질적인 충돌 공격에 당했습니다. 이 취약점으로 인해 보안이 중요한 애플리케이션들은 SHA-1에서 벗어나야 했습니다.
- 비트코인은 SHA-256을 두 번 적용하는데, 이를 이중 해싱이라고 합니다. 블록 헤더와 트랜잭션 ID는 SHA-256으로 해시된 뒤, 그 결과가 다시 SHA-256으로 해시됩니다. 사토시는 이 선택을 설명한 적이 없으며, 흔히 드는 설명은 SHA-256 같은 Merkle–Damgård 해시의 알려진 특성인 길이 확장 공격을 막기 위해서라는 것입니다. 체인상의 모든 블록 해시와 트랜잭션 ID는 이 두 번의 해싱을 거친 결과입니다.
- 아무 터미널이나 온라인 도구를 열고 문자열 'MSTR Cat'의 SHA-256 해시를 계산해 보세요. 그다음 한 글자의 대소문자만 바꾼 'MSTR cat'의 해시를 계산하세요. 64자리 16진수 출력 두 개를 비교해 보세요. 둘은 완전히 다르며 알아볼 수 있는 패턴을 전혀 공유하지 않습니다. 이 즉각적인 차이는 눈사태 효과가 실제로 작동하는 모습을 보여 줍니다. 단 한 비트의 변화가 다이제스트 전체를 뒤섞으며, 이 함수가 입력에 극도로 민감하게 반응한다는 것을 확인시켜 줍니다.
핵심 사실
- SHA-256은 입력 크기에 관계없이 항상 고정된 256비트의 출력을 생성합니다.
- 눈사태 효과 덕분에 하나의 비트가 변하면 해시 비트의 약 절반이 변경됩니다.
- 브루트포스 방식으로 SHA-256 충돌을 찾는 데에는 약 2^128번의 연산이 필요합니다.
- SHA-1은 2017년 실질적인 충돌 공격(SHAttered)으로 깨졌습니다.
- 비트코인은 블록 해시와 트랜잭션 ID에 이중 SHA-256을 사용합니다.
- SHA-256은 64라운드에 걸쳐 512비트 블록 단위로 데이터를 처리합니다.
연습 아홉, 여섯, 셋, 하나
9모으기컴퓨팅에서 사용되는 해시 함수 또는 체크섬 알고리즘 9가지를 나열하세요. 각각의 출력 크기와 주요 용도를 적으세요.
6묶기9가지를 보안 강도에 따라 6개 범주로 분류하세요: 깨진 것, 사용이 중단된 것, 일반 용도의 표준, 고보안 환경용 표준, 속도에 특화된 것, 기타.
3추리기6개 그룹을 특정 용도에 해시 함수가 선택되는 3가지 핵심 이유로 줄이세요.
1결정화고정 길이 다이제스트가 어떻게 가변 크기 데이터의 검증을 가능하게 하는지 한 문장으로 설명하세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.