해싱과 데이터 무결성
SHA-256, MD5, HMAC가 고정 길이 다이제스트를 생성하여 전송 중이나 저장 중 데이터가 변경되지 않았는지 확인하는 방법을 학습합니다.
해싱과 데이터 무결성은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
Hash 함수란 무엇입니까?
암호학적 Hash 함수는 크기에 관계없이 어떤 input이든 받아 Hash, 다이제스트 또는 지문이라고 하는 고정 길이의 output을 생성하는 수학적 알고리즘입니다. Hash 함수는 단방향입니다. Hash가 주어졌을 때 원래 input을 알아내는 것은 계산상 사실상 불가능해야 합니다. 또한 결정적이므로 동일한 input은 항상 동일한 Hash를 생성합니다. Hash 함수는 데이터 무결성 검증, 디지털 서명, 비밀번호 저장 및 여러 보안 메커니즘의 기반입니다.
안전한 Hash 함수의 특성
안전한 암호학적 Hash 함수에는 네 가지 핵심 특성이 있어야 합니다. 원상 저항성: Hash output이 주어졌을 때 이를 생성하는 어떤 input이든 찾는 것이 계산상 사실상 불가능해야 합니다. 제2 원상 저항성: input이 주어졌을 때 동일한 Hash를 갖는 다른 input을 찾는 것이 불가능해야 합니다. 충돌 저항성: 동일한 Hash output을 생성하는 서로 다른 두 input을 찾는 것이 불가능해야 합니다. Avalanche 효과: input의 단 하나의 bit만 변경해도 완전히 다른 Hash output이 생성되어 변조를 탐지할 수 있어야 합니다.
# Avalanche effect demonstration
echo -n 'Hello' | sha256sum
# 185f8db32... (completely different when one char changes)
echo -n 'Hello!' | sha256sum
# 334d016f7... (entirely different hash)
# Same input ALWAYS produces same hash (deterministic)
echo -n 'Security+' | sha256sum
echo -n 'Security+' | sha256sum
# Both outputs are identicalMD5: 손상되어 폐기된 알고리즘
MD5 (Message Digest 5)는 128-bit Hash를 생성하며 한때 널리 사용되었습니다. 그러나 2004년에 연구자들이 MD5에 대한 충돌 공격을 입증했습니다. 즉, 동일한 Hash를 생성하는 서로 다른 두 input을 찾을 수 있다는 뜻입니다. 이는 무결성 검증에 치명적입니다. 공격자가 원본과 동일한 MD5 Hash를 가진 악성 File로 바꿔치기할 수 있기 때문입니다. MD5는 암호학적 보안 측면에서 완전히 손상되었으므로 무결성 검증, 디지털 서명 또는 비밀번호 Hash에 사용해서는 안 됩니다. 다만 보안 목적이 아닌 체크섬(레거시 File 검증)에는 여전히 사용되기도 하며, 이는 우발적인 손상만 탐지하는 용도라면 허용됩니다.
SHA 계열: SHA-1, SHA-256, SHA-3
Secure Hash Algorithm (SHA) 계열은 Security+에서 가장 중요한 Hash 함수 모음입니다. SHA-1(160-bit)은 수년간 표준이었지만 2017년에 실제 충돌 공격(Google의 SHAttered 프로젝트)으로 무력화되었으며 현재는 폐기되었습니다. SHA-256(SHA-2 계열에 속하며 256-bit output)은 디지털 서명, TLS 인증서 및 File 무결성 검증에 사용하는 현재 업계 표준입니다. SHA-3(Keccak)는 SHA-2의 구조를 겨냥한 공격에 대한 저항성을 제공하는 NIST의 대체 알고리즘이지만, 대부분의 애플리케이션에서는 여전히 SHA-256이 주로 사용됩니다.
# Common hash computations
echo -n 'password123' | sha256sum
# a665a4592...64 hex chars = 256 bits
echo -n 'password123' | sha512sum
# b109f3bb...128 hex chars = 512 bits (SHA-512)
# File integrity check
sha256sum /path/to/downloaded_file.iso > file.sha256
sha256sum -c file.sha256
# file.iso: OK비밀번호 저장을 위한 Hash 함수
비밀번호를 평문으로 저장하는 것은 절대 허용되지 않습니다. 사용자가 비밀번호를 생성하면 비밀번호 자체 대신 데이터베이스에 Hash가 저장됩니다. 사용자가 로그인하면 입력한 비밀번호를 Hash한 뒤 Stored Hash와 비교합니다. 그러나 표준 SHA-256은 비밀번호 저장에 사용하기에는 너무 빠릅니다. 공격자는 탈취한 비밀번호 데이터베이스를 대상으로 GPU를 사용해 초당 수십억 개의 Hash를 시험할 수 있기 때문입니다. bcrypt, PBKDF2, Argon2와 같은 목적에 맞게 설계된 비밀번호 Hash 함수는 계산 비용(작업 계수)과 메모리 요구 사항을 추가하여 대량 크래킹을 현실적으로 어렵게 만듭니다.
# bcrypt hash example (Python-style pseudocode)
import bcrypt
password = b'mySecretPassword'
# Hash with work factor of 12 (2^12 = 4096 iterations)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# Stored in DB: $2b$12$H0qS/LkPkAiH8KlxJb3lFuK...
# Verify (never compare raw hashes for bcrypt)
bcrypt.checkpw(password, hashed) # Returns TrueSalt 적용: 레인보 테이블 무력화
레인보 테이블은 일반적인 비밀번호와 해당 Hash를 미리 계산해 연결해 둔 조회 테이블입니다. 따라서 공격자는 Hash를 즉시 조회하여 원래 비밀번호를 찾을 수 있습니다. 레인보 테이블을 무력화하려면 비밀번호 Hash에 Salt를 적용해야 합니다. Salt는 Hash를 계산하기 전에 비밀번호에 추가하는 무작위 값으로, 두 사용자가 같은 비밀번호를 사용하더라도 각 사용자의 Hash가 고유해지게 합니다. Salt는 Hash와 함께 저장하며 비밀로 유지할 필요는 없습니다. 공격자가 사용자의 전체 비밀번호 데이터베이스를 확보하더라도 각 Hash에 서로 다른 Salt가 사용되었으므로 미리 계산된 레인보 테이블은 쓸모가 없습니다.
# Salt demonstration
# Without salt: same password = same hash (rainbow table attack works)
# SHA256('password123') = always the same hash
# With salt: same password + random salt = unique hash
# SHA256('password123' + 'aBc8xZ') = unique hash for this user
# SHA256('password123' + 'mK2pYq') = completely different hash
# The salt is stored in the database alongside the hashed value
# Format: $salt$hash or combined as in bcrypt outputHMAC: Hash에 인증 추가
HMAC (Hash-based Message Authentication Code)는 비밀 key와 Hash 함수를 사용해 인증 코드를 생성하는 방식입니다. 일반 Hash와 달리 HMAC은 비밀 key를 알고 있는 당사자만 Compute하고 Verify할 수 있습니다. 이를 통해 무결성(변경 탐지)과 인증(메시지가 해당 key를 가진 사람에게서 왔음을 입증)을 모두 제공합니다. HMAC-SHA256은 API 인증(API 요청 서명), JWT 토큰 및 TLS MAC 작업에 널리 사용됩니다. 또한 메시지를 가로챈 공격자가 이를 조작한 다른 메시지로 바꾸는 것을 방지합니다.
# Compute HMAC-SHA256 with OpenSSL
openssl dgst -sha256 -hmac 'my-secret-api-key' -hex api_request.json
# Output: HMAC-SHA256(api_request.json)= 3d4e2f...
# Only someone with 'my-secret-api-key' can generate or verify this HMAC
# Used in AWS Signature V4 for API authentication
# Used in JWT HS256 algorithm for token integrity디지털 서명에서의 Hash 함수
Hash 함수는 디지털 서명에서 핵심적인 역할을 합니다. 대형 문서에 서명할 때는 전체 문서를 Private 키로 암호화하지 않습니다. 그렇게 하면 매우 느리기 때문입니다. 대신 다음과 같이 처리합니다. (1) 문서의 Hash를 Compute합니다(빠르게 처리되며 작은 고정 길이 다이제스트를 생성합니다). 그런 다음 (2) 작은 Hash를 Private 키로 서명합니다. 서명은 암호화된 Hash일 뿐입니다. Verify도 같은 방식으로 수행합니다. 서명을 복호화해 Hash를 얻고, 문서를 독립적으로 Hash한 다음 서로 비교합니다. 모든 최신 PKI 인증서에서는 SHA-256이 필수이며, 새 인증서에서는 SHA-1이 금지됩니다.
File 무결성 모니터링(FIM)
File Integrity Monitoring (FIM)은 Hash 함수를 사용해 중요한 시스템 File의 무단 변경을 탐지합니다. 기준선을 설정할 때 FIM 도구는 모니터링 대상인 모든 File의 Hash를 계산하고 이를 안전하게 저장합니다. 주기적으로 또는 지속적으로 File의 Hash를 다시 계산하여 기준선과 비교합니다. 일치하지 않으면 해당 File이 수정되었다는 뜻이며, 악성 코드나 무단 관리자 작업이 원인일 수 있습니다. Tripwire, AIDE(Linux), Windows 자체 무결성 검사와 같은 FIM 도구는 SHA-256 Hash를 사용합니다. FIM은 카드 소유자 데이터 환경을 보호하기 위해 PCI-DSS와 같은 규정 준수 프레임워크에서 요구됩니다.
# AIDE (Advanced Intrusion Detection Environment) - Linux FIM
# Initialize baseline database
aide --init
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# Check for changes (run via cron daily)
aide --check
# Output shows any files that were added, changed, or deleted
# File: /etc/passwd changed
# MD5 : old_hash != new_hash체크섬과 암호학적 Hash 비교
체크섬과 암호학적 Hash를 구분하는 것이 중요합니다. CRC32와 같은 체크섬은 전송 중 우발적인 데이터 손상을 탐지하도록 설계되었습니다. 빠르고 단순하지만 공격자가 쉽게 위조할 수 있습니다. 암호학적 Hash(SHA-256)는 공격자의 조작에 대해서도 충돌에 강하고 변조를 식별할 수 있도록 설계되었습니다. 다운로드가 전송 중 손상되지 않았는지만 확인하면 될 때는 체크섬을 사용하고, 공격자가 File을 의도적으로 변조하지 않았는지 확인해야 할 때는 암호학적 Hash를 사용하십시오.
실제 Hash 충돌 공격
Hash 충돌 공격은 실제 세계에 영향을 미칩니다. 2017년에 연구자들은 동일한 SHA-1 Hash를 가진 서로 다른 두 PDF File을 만들어 SHA-1 인증서를 위조할 수 있음을 입증했습니다. 2008년에는 연구자들이 MD5 충돌을 이용해 정식 인증서처럼 보이는 가짜 CA 인증서를 만들었습니다. 이러한 공격 때문에 브라우저는 MD5 및 SHA-1 인증서를 거부하며, 인증 기관은 최소 SHA-256을 사용해야 합니다. 충돌 공격을 이해하면 알고리즘 폐기 결정이 내려지는 이유와 ‘그래도 Hash는 생성되잖아’라는 말이 손상된 알고리즘을 사용해야 할 충분한 근거가 되지 못하는 이유를 설명할 수 있습니다.
빠른 확인
이 lesson에서 다룬 CompTIA Security+ (SY0-701) 개념에 대한 이해도를 확인해 보십시오.
lesson 요약
이 lesson에서는 다음을 배웠습니다. Hash 함수는 무결성 검증을 위해 고정 길이 다이제스트를 생성합니다. MD5와 SHA-1은 손상되어 폐기되었고, SHA-256은 현재 표준입니다. Salt 적용은 레인보 테이블 공격을 무력화하며, HMAC은 Shared 비밀 key를 사용해 Hash에 인증을 추가합니다. 다음에서는 키 교환과 하이브리드 암호화를 살펴봅니다.
자주 묻는 질문
“해싱과 데이터 무결성” 강의는 무료인가요?
네 — “해싱과 데이터 무결성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“해싱과 데이터 무결성”에서 뭘 배우나요?
SHA-256, MD5, HMAC가 고정 길이 다이제스트를 생성하여 전송 중이나 저장 중 데이터가 변경되지 않았는지 확인하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“해싱과 데이터 무결성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 대칭 암호화 알고리즘
- 비대칭 암호화와 키 쌍
- 해싱과 데이터 무결성
- 키 교환과 하이브리드 암호화