체크섬
체크섬(Checksum)은 데이터의 오류 여부를 확인하기 위해 데이터로부터 계산한 작은 크기의 검증값이다. 송신자와 수신자가 같은 방식으로 체크섬을 계산하여 비교함으로써 데이터가 전송 또는 저장 과정에서 손상되었는지 확인할 수 있다.
체크섬은 데이터의 무결성을 간단히 확인하기 위한 오류 검출 기법이다. 원본 데이터에 대해 특정 계산을 수행하여 체크섬 값을 만들고, 이후 같은 데이터에 대해 다시 계산한 체크섬 값과 비교한다.
두 값이 같으면 데이터가 손상되지 않았을 가능성이 높고, 두 값이 다르면 데이터가 변경되었거나 오류가 발생한 것으로 판단한다.
체크섬은 네트워크, 파일 전송, 저장장치, 통신 프로토콜, 데이터 무결성 확인 등에 널리 사용된다.
체크섬의 주요 목적은 다음과 같다.
- 데이터 전송 중 오류 검출
- 파일 다운로드 후 손상 여부 확인
- 저장 데이터의 무결성 확인
- 네트워크 패킷 오류 검출
- 디스크나 메모리 오류 탐지 보조
- 통신 프로토콜의 기본 오류 검출
체크섬은 원본 데이터를 일정한 방식으로 계산하여 검증값을 생성한다.
일반적인 절차는 다음과 같다.
- 송신자가 데이터에서 체크섬 값을 계산한다.
- 송신자는 데이터와 체크섬을 함께 전송한다.
- 수신자는 받은 데이터로 다시 체크섬을 계산한다.
- 수신자는 계산한 체크섬과 함께 받은 체크섬을 비교한다.
- 값이 같으면 정상으로 판단한다.
- 값이 다르면 오류가 발생한 것으로 판단한다.
데이터가 다음과 같다고 하자.
10, 20, 30, 40
단순한 체크섬 방식으로 모든 값을 더하면 다음과 같다.
10 + 20 + 30 + 40 = 100
따라서 체크섬은 100이 된다.
수신자가 받은 데이터가 다음과 같이 바뀌었다고 하자.
10, 20, 31, 40
다시 합계를 계산하면 다음과 같다.
10 + 20 + 31 + 40 = 101
송신자가 보낸 체크섬 100과 수신자가 계산한 체크섬 101이 다르므로 오류를 탐지할 수 있다.
체크섬의 특징은 다음과 같다.
- 계산이 비교적 단순하다.
- 오류 검출에 사용된다.
- 오류를 자동으로 수정하지는 않는다.
- 모든 오류를 완벽하게 검출하지는 못한다.
- 데이터 무결성 확인에 활용된다.
- 암호학적 보안 기능과는 구분된다.
체크섬은 일반적으로 오류 검출(Error Detection)을 위한 기법이다.
| 구분 | 설명 |
|---|---|
| 오류 검출 | 데이터에 오류가 있는지 확인 |
| 오류 정정 | 오류가 있는 위치와 값을 찾아 수정 |
체크섬은 오류가 발생했는지 확인할 수 있지만, 어느 부분이 잘못되었는지 또는 어떻게 고쳐야 하는지는 알 수 없는 경우가 많다. 오류 정정이 필요할 때는 해밍 코드, 오류 정정 코드 같은 기법을 사용한다.
단순 합 체크섬은 데이터를 일정 단위로 나누어 모두 더한 뒤 그 결과를 검증값으로 사용하는 방식이다.
구현이 쉽고 빠르지만, 서로 다른 오류가 같은 합계를 만들 수 있으므로 검출 능력은 제한적이다.
1의 보수 체크섬은 여러 통신 프로토콜에서 사용되는 방식이다.
데이터를 일정한 크기의 단어로 나누어 더한 뒤, 자리올림을 다시 더하고, 마지막에 1의 보수를 취하는 방식으로 계산한다.
대표적으로 IP, TCP, UDP의 체크섬 계산과 관련된다.
CRC(Cyclic Redundancy Check)는 다항식 나눗셈을 이용하는 오류 검출 기법이다.
CRC는 단순 합 체크섬보다 오류 검출 능력이 뛰어나며, 네트워크 프레임, 저장장치, 압축 파일 등에서 널리 사용된다.
대표적인 CRC 예는 다음과 같다.
- CRC-8
- CRC-16
- CRC-32
해시 함수를 이용해 데이터의 검증값을 만들 수도 있다.
예:
- MD5
- SHA-1
- SHA-256
다만 일반적인 체크섬과 암호학적 해시는 목적이 다르다. 체크섬은 주로 우연한 오류 검출을 목적으로 하고, 암호학적 해시는 위조나 변조 탐지에 더 강한 보안 특성을 목표로 한다.
체크섬과 CRC는 모두 오류 검출에 사용되지만, CRC는 더 강한 오류 검출 능력을 제공하는 경우가 많다.
| 구분 | 체크섬 | CRC |
|---|---|---|
| 계산 방식 | 합산, 보수 연산 등 비교적 단순 | 다항식 기반 계산 |
| 오류 검출 능력 | 상대적으로 낮음 | 상대적으로 높음 |
| 구현 난이도 | 낮음 | 상대적으로 높음 |
| 사용 예 | IP, TCP, UDP 체크섬 | Ethernet, 압축 파일, 저장장치 |
체크섬과 해시 함수는 모두 데이터에서 고정 길이의 값을 계산한다는 점에서 비슷하지만 목적과 보안 수준이 다르다.
| 구분 | 체크섬 | 해시 함수 |
|---|---|---|
| 주요 목적 | 우연한 오류 검출 | 데이터 식별, 무결성 확인, 보안 검증 |
| 보안성 | 낮음 | 암호학적 해시는 높음 |
| 충돌 저항성 | 중요하지 않거나 낮음 | 중요함 |
| 대표 예 | 단순 합, IP 체크섬 | SHA-256, SHA-3 |
| 악의적 변조 탐지 | 부적합 | 암호학적 해시 사용 시 적합 |
암호학적 보안이 필요한 경우에는 단순 체크섬이 아니라 암호학적 해시 함수나 전자서명, MAC 등을 사용해야 한다.
네트워크에서는 패킷이나 프레임이 전송 중 손상되었는지 확인하기 위해 체크섬을 사용한다.
IPv4 헤더에는 헤더 오류 검출을 위한 체크섬 필드가 있다.
IPv4 헤더 체크섬은 IP 헤더에 대해서만 계산되며, 데이터 부분은 포함하지 않는다. 라우터를 거칠 때마다 TTL 값이 변경되므로 IPv4 헤더 체크섬도 다시 계산될 수 있다.
참고로 IPv6에는 IPv4와 같은 헤더 체크섬 필드가 없다.
TCP 체크섬은 TCP 세그먼트의 오류를 검출하기 위해 사용된다.
TCP 체크섬은 TCP 헤더와 데이터뿐 아니라, 의사 헤더라고 부르는 IP 주소 관련 정보도 함께 포함하여 계산한다.
UDP 체크섬은 UDP 데이터그램의 오류 검출에 사용된다.
IPv4에서는 UDP 체크섬이 선택적일 수 있었지만, IPv6에서는 UDP 체크섬이 필수이다.
Ethernet 프레임에서는 FCS(Frame Check Sequence)를 사용한다.
FCS는 일반적으로 CRC를 이용하여 프레임의 오류를 검출한다.
파일 다운로드 후 파일이 손상되지 않았는지 확인하기 위해 체크섬 또는 해시값을 제공하는 경우가 많다.
예:
SHA256: 3a6eb0790f39ac87c94f3856b2dd2c5d...
사용자는 다운로드한 파일의 해시값을 계산하여 제공된 값과 비교할 수 있다.
Linux에서는 다음과 같은 명령어를 사용할 수 있다.
sha256sum file.iso md5sum file.iso cksum file.txt
cksum은 Linux와 Unix 계열 시스템에서 파일의 CRC 체크섬과 바이트 수를 출력하는 명령어이다.
사용 예:
cksum file.txt
출력 예:
1234567890 2048 file.txt
출력 항목은 일반적으로 다음을 의미한다.
| 항목 | 설명 |
|---|---|
| 첫 번째 값 | CRC 체크섬 값 |
| 두 번째 값 | 파일 크기 |
| 세 번째 값 | 파일명 |
저장장치와 파일 시스템에서도 체크섬이 사용될 수 있다.
활용 예는 다음과 같다.
- 디스크 블록 오류 검출
- 파일 시스템 메타데이터 보호
- RAID 데이터 무결성 확인
- 백업 데이터 검증
- 데이터 전송 중 손상 여부 확인
일부 파일 시스템은 데이터 또는 메타데이터에 체크섬을 적용하여 손상을 탐지한다.
체크섬의 장점은 다음과 같다.
- 계산이 빠르다.
- 구현이 단순하다.
- 작은 검증값으로 오류를 탐지할 수 있다.
- 네트워크와 저장장치에서 널리 사용된다.
- 데이터 전송 과정의 우연한 오류를 탐지하는 데 유용하다.
체크섬의 한계는 다음과 같다.
- 모든 오류를 검출하지 못한다.
- 서로 다른 데이터가 같은 체크섬을 가질 수 있다.
- 오류 위치를 알기 어렵다.
- 오류를 자동으로 정정하지 못한다.
- 악의적인 변조를 탐지하기에는 부족하다.
- 보안 목적에는 암호학적 해시나 MAC이 필요하다.
충돌(Collision)은 서로 다른 데이터가 같은 체크섬 값을 가지는 경우를 말한다.
체크섬 값의 크기가 작을수록 충돌 가능성은 높아진다. 단순 체크섬은 우연한 오류 검출에는 사용할 수 있지만, 의도적인 조작을 막기에는 충분하지 않다.
체크섬은 다음 분야에서 사용된다.
- 네트워크 패킷 오류 검출
- 파일 다운로드 검증
- 압축 파일 무결성 확인
- 저장장치 데이터 검증
- 백업 데이터 검증
- 펌웨어 이미지 검증
- 통신 프로토콜 오류 검출
- 데이터 전송 검증
체크섬은 보안 기능으로 오해하면 안 된다.
공격자가 데이터와 체크섬을 함께 수정할 수 있다면 단순 체크섬은 변조를 막지 못한다. 따라서 악의적인 변조를 탐지하려면 다음과 같은 보안 기술이 필요하다.
예를 들어 파일이 우연히 손상되었는지 확인하는 용도에는 체크섬이 유용하지만, 공격자가 파일을 바꿨는지 확인하는 용도에는 SHA-256 해시와 전자서명 검증이 더 적절하다.
| 구분 | 체크섬 | 패리티 비트 |
|---|---|---|
| 단위 | 데이터 블록 또는 패킷 | 비트열 |
| 방식 | 계산값을 추가 | 1의 개수가 홀수 또는 짝수가 되도록 비트 추가 |
| 검출 능력 | 패리티보다 일반적으로 높음 | 제한적 |
| 오류 정정 | 일반적으로 불가 | 일반적으로 불가 |
| 구분 | 체크섬 | 오류 정정 코드 |
|---|---|---|
| 목적 | 오류 검출 | 오류 검출 및 정정 |
| 오류 위치 확인 | 어려움 | 가능할 수 있음 |
| 예 | IP 체크섬, cksum | 해밍 코드, ECC |
| 구분 | 체크섬 | HMAC |
|---|---|---|
| 목적 | 우연한 오류 검출 | 메시지 인증과 무결성 검증 |
| 비밀키 사용 | 사용하지 않음 | 사용함 |
| 악의적 변조 대응 | 부적합 | 적합 |
| 보안성 | 낮음 | 높음 |
체크섬은 네트워크와 시스템에서 기본적인 오류 검출 개념으로 자주 등장한다. 학습할 때는 다음 사항을 중심으로 정리하는 것이 좋다.
- 체크섬은 오류 검출용 값이다.
- 송신자와 수신자가 같은 방식으로 계산하여 비교한다.
- 체크섬은 오류를 정정하지 않는다.
- 단순 체크섬은 보안 기능이 아니다.
- CRC는 체크섬보다 강한 오류 검출 방식으로 자주 사용된다.
- TCP, UDP, IPv4에서 체크섬이 사용된다.
- Ethernet은 FCS를 통해 프레임 오류를 검출한다.
- 파일 무결성 확인에는 체크섬 또는 해시값이 사용된다.
- 체크섬은 데이터 오류 검출을 위한 검증값이다.
- 체크섬 값이 다르면 데이터가 손상되었거나 변경되었음을 알 수 있다.
- 체크섬 값이 같아도 데이터가 반드시 완전히 동일하다고 보장할 수는 없다.
- 체크섬은 일반적으로 오류 정정 기능을 제공하지 않는다.
- IP, TCP, UDP 등 네트워크 프로토콜에서 체크섬이 사용된다.
- IPv4 헤더에는 체크섬 필드가 있지만 IPv6 기본 헤더에는 체크섬 필드가 없다.
- TCP와 UDP 체크섬은 오류 검출에 사용된다.
- CRC는 대표적인 오류 검출 기법이다.
- 체크섬은 보안 목적의 변조 방지 수단으로는 부족하다.
- 악의적 변조 탐지에는 암호학적 해시, HMAC, 전자서명 등을 사용한다.
