해시 생성기
해시 함수 완벽 가이드
1. 해시 함수란 무엇인가
해시 함수(Hash Function)는 임의 크기의 데이터를 고정 크기의 값으로 변환하는 단방향 함수입니다. 입력값이 조금만 달라져도 완전히 다른 해시값이 생성되는 특성(눈사태 효과)을 가지며, 같은 입력은 항상 같은 출력을 만듭니다. MD5는 128비트, SHA-1은 160비트, SHA-256은 256비트 해시를 생성합니다. 해시는 복호화할 수 없는 단방향 함수이므로 원본 데이터를 숨기면서 무결성을 검증하는 데 이상적입니다. 파일 다운로드 검증, 비밀번호 저장, 블록체인, 디지털 서명 등에 널리 사용됩니다.
2. MD5 vs SHA 알고리즘 비교
MD5는 1991년 개발된 128비트 해시로 매우 빠르지만 충돌 공격에 취약합니다. 2004년 심각한 보안 취약점이 발견되어 암호학적 용도로는 부적합하며, 파일 체크섬 정도로만 사용됩니다. SHA-1은 160비트 해시로 MD5보다 안전했지만 2017년 구글이 실제 충돌 사례를 발표하며 사용이 중단되었습니다. SHA-256은 SHA-2 계열로 256비트 해시를 생성하며, 현재 가장 널리 사용되는 표준입니다. 비트코인도 SHA-256을 사용합니다. SHA-512는 512비트로 더 높은 보안을 제공하지만 속도는 느립니다. 새로운 시스템은 SHA-256 이상을 사용해야 합니다.
3. 해시 보안과 취약점
해시 함수의 주요 보안 요구사항은 세 가지입니다. 첫째, 역상 저항성(Preimage Resistance): 해시값으로부터 원본을 찾기 어려워야 합니다. 둘째, 제2 역상 저항성(Second Preimage Resistance): 같은 해시를 만드는 다른 입력을 찾기 어려워야 합니다. 셋째, 충돌 저항성(Collision Resistance): 같은 해시를 만드는 두 개의 서로 다른 입력을 찾기 어려워야 합니다. MD5와 SHA-1은 충돌 저항성이 깨져 공격자가 의도적으로 같은 해시를 만들 수 있습니다. 레인보우 테이블(Rainbow Table) 공격은 미리 계산된 해시 테이블로 역추적하는 방법인데, salt를 추가하면 방어할 수 있습니다.
4. 파일 무결성 검증
파일 해시는 다운로드한 파일이 변조되지 않았는지 확인하는 가장 효과적인 방법입니다. 소프트웨어 배포 사이트는 파일과 함께 공식 해시값을 제공합니다. 사용자는 다운로드 후 파일의 해시를 계산하고 공식 값과 비교합니다. 단 한 비트라도 다르면 완전히 다른 해시가 나오므로 변조를 즉시 감지할 수 있습니다. Linux ISO 이미지, 오픈소스 소프트웨어, 블록체인 거래 등에서 필수적으로 사용됩니다. Git도 커밋마다 SHA-1 해시를 생성하여 코드 무결성을 보장합니다. 대용량 파일 전송 시 네트워크 오류로 인한 손상도 해시로 탐지할 수 있습니다.
5. 비밀번호 해싱 베스트 프랙티스
비밀번호를 데이터베이스에 저장할 때 절대 평문으로 저장하면 안 됩니다. 해시로 변환하여 저장해야 하지만, 단순 MD5나 SHA-256은 부적절합니다. 레인보우 테이블 공격에 취약하기 때문입니다. 반드시 솔트(Salt)를 추가해야 합니다. 솔트는 비밀번호에 추가되는 랜덤 문자열로, 같은 비밀번호도 다른 해시를 만듭니다. 더 나아가 bcrypt, scrypt, Argon2 같은 느린 해시 함수를 사용해야 합니다. 이들은 의도적으로 계산을 느리게 하여 브루트 포스 공격을 어렵게 만듭니다. OWASP는 비밀번호 해싱에 Argon2를 최우선으로 권장합니다.
6. 레인보우 테이블과 솔트
레인보우 테이블(Rainbow Table)은 미리 계산된 해시 값들의 거대한 데이터베이스입니다. 흔한 비밀번호 수백만 개의 해시를 미리 저장해두고, 탈취한 해시와 매칭하여 원본 비밀번호를 찾습니다. 예를 들어 "password123"의 MD5는 항상 "482c811da5d5b4bc6d497ffa98491e38"이므로 테이블에서 즉시 찾을 수 있습니다. 솔트(Salt)는 이를 방어하는 방법입니다. 각 사용자마다 고유한 랜덤 문자열을 추가하면, 같은 비밀번호도 다른 해시가 됩니다. "password123" + "x8k2m9"을 해싱하면 레인보우 테이블에 없는 값이 나옵니다. 솔트는 DB에 평문으로 저장해도 되며, 각 비밀번호마다 다른 솔트를 사용해야 효과적입니다.