해싱 설명: MD5, SHA, 그리고 각각 언제 쓸지
해시 함수는 데이터를 지문으로 바꿔. 어떻게 작동하고 MD5가 왜 아직 안 죽었는지.
파일을 다운로드해. 웹사이트가 MD5 체크섬을 보여줘. 어떻게든 검증해야 해. 하지만 왜? 그리고 MD5랑 SHA-256의 차이는 뭐야?
해시 함수는 소프트웨어 어디든 있어. 이해하면 올바르게 사용하는 데 도움이 돼.
해싱이 하는 것
해시 함수는 어떤 입력이든 받아서 고정 크기 출력을 만들어. 같은 입력에 항상 같은 출력. 입력의 한 비트를 바꾸면 출력이 완전히 바뀌어.
"hello" → 5d41402abc4b2a76b9719d911017c592 (MD5)
"Hello" → 8b1a9953c4611296a827abf8c47804d7 (MD5)
대문자 하나가 전체 해시를 바꿔. 그게 포인트야.
해시 vs 암호화
해싱은 일방향이야. 해시를 역으로 해서 원본 데이터를 얻을 수 없어.
암호화는 양방향이야. 올바른 키로 복호화해서 원본을 복구할 수 있어.
누가 MD5 해시를 "복호화"할 수 있다고 하면 그들은 크래킹하고 있거나 (하나가 일치할 때까지 입력 시도) 해싱이 어떻게 작동하는지 혼란스러워하는 거야.
흔한 알고리즘들
MD5 - 128비트 출력. 빠르지만 암호학적으로 깨짐. 체크섬엔 괜찮고, 보안엔 안 돼.
SHA-1 - 160비트. 암호학적 사용으로도 깨짐. 레거시 시스템이 여전히 써.
SHA-256 - 256비트. 현재 표준. 보안이 중요할 때 이걸 써.
SHA-512 - 512비트. 약간 더 안전하고, 64비트 시스템에선 때때로 더 빨라.
BLAKE2/BLAKE3 - 현대 대안. SHA-256보다 빠르고 비슷한 보안.
MD5가 괜찮을 때
MD5는 "깨졌다"고 나쁜 평판을 받아. 하지만 암호학적으로 깨졌다는 건 쓸모없다는 게 아니야.
파일 무결성 체크. 다운로드가 손상되지 않았는지 검증. 공격자가 같은 해시의 악의적 파일을 만들려면 대부분의 공격이 가치 있는 것보다 더 많은 노력이 필요해, 비보안 맥락에선.
캐시 키. 콘텐츠를 해싱해서 고유 식별자 생성. 보안 함의 없음.
중복 제거. 해시를 비교해서 중복 파일 찾기.
SHA-256이나 더 나은 걸 써야 할 때
비밀번호 저장. 사실 bcrypt나 Argon2를 대신 써. 비밀번호용으로 설계됐어.
디지털 서명. 적대자가 위조를 시도할 수 있는 문서 무결성.
보안에 중요한 모든 것. 공격자가 충돌을 찾을 인센티브가 있을 때.
충돌 문제
충돌은 두 개의 다른 입력이 같은 해시를 만들 때야. 생일 수학은 충돌이 예상보다 빨리 가능해진다고 말해.
MD5는 연구자들이 의도적 충돌을 만드는 방법을 찾았어. 두 개의 다른 파일, 같은 해시. 그래서 "깨진" 거야.
SHA-256은 실용적 충돌 공격이 없어. 아직은.
실전 예제
다운로드 검증:
sha256sum ubuntu.iso
# 출력을 다운로드 페이지의 해시와 비교
API 키 저장: 실제 키가 아니라 해시를 저장해. 사용자가 키를 제출하면 해싱하고 비교해.
Git 커밋:
Git은 SHA-1을 써서 커밋 식별. 그래서 커밋 해시가 a1b2c3d4e5f6... 같이 보이는 거야.
직접 만들지 마
절대 자신만의 해싱 스킴을 발명하지 마. "MD5 두 번" 또는 "salt 추가한 SHA-256"은 확립된 패턴을 쓰는 것보다 나빠.
비밀번호용: bcrypt, scrypt, 또는 Argon2. 무결성용: SHA-256. 속도용: BLAKE3.
전문가들이 이미 알아냈어.
해시 함수는 개념적으로 간단하지만 적용에선 미묘해. 작업에 맞는 알고리즘을 고르고, 단순한 체크섬으로 충분할 곳에 암호학적 해싱을 쓰지 마.