무결성
고친 사람 github-actions[bot]
무결성은 데이터가 만들어진 뒤로 몰래 바뀌지 않았는지 확인하게 해 주는 성질입니다. 받는 쪽은 받은 데이터가 보낸 쪽이 만든 것과 같은지 스스로 검사합니다. 데이터베이스에서는 데이터가 정해진 규칙을 어기지 않은 상태를 가리키는 말로도 씁니다.
쉽고 빠른 이해
무결성은 데이터가 만들어진 뒤로 바뀌지 않았음을 확인하게 해 주는 성질입니다. 내려받은 설치 파일이 배포한 쪽이 올린 그 파일인지 확인하는 일이 여기 해당합니다.
확인할 방법이 없으면 받는 쪽은 망가진 데이터나 남이 바꿔치기한 데이터를 믿고 씁니다.
어떻게 도나:
- 보내는 쪽이 데이터로 짧은 검증값을 계산해 함께 보냅니다
- 받는 쪽이 받은 데이터로 같은 계산을 다시 합니다
- 두 값이 같으면 받아들이고 다르면 버립니다
대가는 계산과 보관이 늘어난다는 것입니다. 그리고 바뀐 것을 알아챌 뿐 원래대로 되돌려 주지는 않습니다.
상세
마트에서 과일을 봉지에 담아 저울에 올리면 무게가 찍힌 쪽지가 나옵니다. 계산대에서는 그 봉지를 저울에 다시 올려 쪽지의 숫자와 견줍니다. 두 값이 어긋나면 누가 하나를 더 넣었든 오는 길에 하나를 흘렸든 담았을 때와 달라진 것입니다.
무결성은 데이터가 만들어진 뒤로 허가 없이 바뀌지 않았다는 성질입니다. 내려받은 설치 파일이 배포한 쪽이 올린 그 파일 그대로인지 따지는 것이 그런 예입니다.
한 비트만 달라져도 무결성이 깨졌다고 말합니다. 바뀐 원인은 가리지 않습니다. 디스크가 고장 나서든 누가 일부러 고쳐서든 원본과 다르면 깨진 것입니다.
무결성을 챙기는 도구는 변경 자체를 막지 못합니다. 데이터가 지나는 길목을 쥔 쪽은 언제든 내용을 바꿀 수 있습니다. 무결성이 주는 것은 바뀌면 받는 쪽이 알아챈다는 보장입니다.
무결성이 깨지는 원인
데이터는 만들어진 곳에서 읽히는 곳까지 가는 동안 여러 손을 탑니다. 네트워크를 지나고 디스크에 눕고 캐시를 거칩니다. 그 구간마다 내용이 달라질 틈이 있습니다.
원인은 크게 둘입니다. 하나는 고장입니다. 전선의 잡음으로 비트가 뒤집히거나, 오래 눕혀 둔 디스크의 자성이 약해져 값이 달라집니다. 저장해 둔 데이터가 저절로 망가지는 이 현상을 비트 부패라고 부릅니다.
다른 하나는 공격입니다. 데이터가 지나는 길목에 끼어든 쪽이 내용을 고쳐서 넘깁니다. 주고받는 두 쪽 사이에 몰래 끼어드는 이 공격을 중간자 공격이라고 부릅니다.
암호화는 이 둘을 막아 주지 않습니다. 암호화는 남이 못 읽게 하는 도구입니다. 내용을 못 읽는 공격자도 암호문의 비트를 뒤집을 수는 있습니다. 받는 쪽은 그것을 풀어 엉뚱한 값을 얻습니다.
남이 못 읽게 막는 성질이 기밀성입니다. 기밀성과 무결성은 그래서 따로 챙깁니다.
무결성을 확인하는 도구 셋
검증값을 무엇으로 만드느냐에 따라 막을 수 있는 것이 달라집니다. 실무에서 쓰는 것은 크게 셋입니다.
| 도구 | 무엇으로 만드나 | 막는 것 | 확인할 수 있는 쪽 |
|---|---|---|---|
| 체크섬 | 데이터만 | 우연한 손상 | 누구나 |
| 메시지 인증 코드 | 데이터 + 비밀 키 | 우연한 손상 · 고의 변조 | 같은 키를 가진 쪽 |
| 전자 서명 | 데이터 + 개인 키 | 우연한 손상 · 고의 변조 | 공개 키를 가진 누구나 |
체크섬은 데이터만 넣어 짧은 값을 뽑습니다. 값을 뽑는 데는 해시 함수를 흔히 씁니다. 해시 함수는 같은 입력에 늘 같은 값을 내놓습니다. 입력이 조금만 달라지면 값은 크게 달라집니다.
체크섬은 계산이 싸서 저장장치와 네트워크 장비가 즐겨 씁니다. 다만 데이터를 고친 쪽이 검증값도 다시 계산해 붙이면 받는 쪽은 눈치채지 못합니다.
메시지 인증 코드는 계산에 두 쪽만 아는 비밀 키를 섞습니다. 키를 모르면 올바른 검증값을 만들 수 없습니다. 그래서 일부러 고친 데이터도 걸립니다. 대신 키를 나눠 가진 쪽끼리만 확인할 수 있습니다.
개인 키와 공개 키는 짝으로 만들어 둔 두 값입니다. 한쪽으로 만든 값은 짝이 되는 다른 쪽으로만 확인됩니다.
전자 서명은 보내는 쪽의 개인 키로 값을 만들고 짝이 되는 공개 키로 확인합니다. 키를 미리 나눠 갖지 않아도 되므로 공개 키를 얻은 누구나 검증합니다. 그 값은 개인 키를 가진 쪽만 만들 수 있어서 보낸 이가 누구인지까지 함께 확인됩니다.
확인이 도는 순서
셋 다 도는 순서는 같습니다. 보내는 쪽이 값을 계산해 붙입니다. 받는 쪽은 같은 계산을 다시 해서 견줍니다.
sequenceDiagram
participant S as 보내는 쪽
participant R as 받는 쪽
S->>S: 데이터로 검증값을 계산한다
S->>R: 데이터와 검증값을 함께 보낸다
R->>R: 받은 데이터로 검증값을 다시 계산한다
Note over R: 두 값이 다르면 버리고 여기서 끝난다
R->>R: 두 값이 같으면 받아들인다
요점은 받는 쪽이 값을 다시 계산한다는 것입니다. 딸려 온 검증값을 믿는 것이 아니라 손에 든 데이터로 직접 만들어 견줍니다. 데이터가 도중에 바뀌었다면 다시 만든 값이 딸려 온 값과 어긋납니다.
기밀성·가용성과의 구분
보안에서는 무결성을 혼자 놓지 않고 기밀성·가용성과 나란히 놓습니다. 셋이 각각 다른 사고를 막습니다.
| 성질 | 지키는 것 | 깨지면 |
|---|---|---|
| 기밀성 | 남이 못 읽게 | 내용이 새어 나간다 |
| 무결성 | 몰래 못 바꾸게 | 틀린 데이터를 믿고 쓴다 |
| 가용성 | 필요할 때 쓸 수 있게 | 서비스가 멈춘다 |
이 셋을 묶어 CIA(Confidentiality · Integrity · Availability, 기밀성 · 무결성 · 가용성) 삼요소라고 부릅니다. 영어 이름의 머리글자를 딴 말입니다.
셋은 따로 깨집니다. 암호를 걸어 둔 파일도 누가 내용을 뒤섞으면 무결성이 깨집니다. 무결성을 지킨 데이터도 서버가 내려가면 못 씁니다. 하나를 챙겼다고 나머지가 따라오지 않습니다.
데이터베이스에서 쓰는 뜻
데이터베이스 쪽에서도 무결성이라는 말을 자주 씁니다. 거기서는 「아무도 안 고쳤나」가 아니라 「데이터가 정해진 규칙을 어기지 않았나」를 가리킵니다.
주문 행이 가리키는 회원이 회원 테이블에 있어야 한다는 규칙이 그런 예입니다. 이 규칙을 지키는 성질이 참조 무결성입니다. 행마다 서로 다른 기본 키를 가져야 한다는 규칙, 나이 칸에 음수가 못 들어간다는 규칙도 같은 말로 부릅니다.
두 뜻은 「이 데이터를 믿고 써도 되나」를 묻는다는 점에서 이어집니다. 갈리는 것은 깨졌는지 판정하는 방법입니다. 보안 쪽은 원본과 같은지를 검증값으로 봅니다. 데이터베이스 쪽은 제약 조건을 어겼는지를 봅니다.
무결성 확인의 한계
무결성 확인은 바뀌었다는 사실만 알려 줍니다. 원래 값이 무엇이었는지는 알려 주지 않습니다. 되돌리려면 복사본이나 오류 정정 부호가 따로 있어야 합니다.
도구를 고르는 기준
기준은 「누가 바꾸는가」입니다. 전선 잡음이나 디스크 고장처럼 고의가 없는 손상만 걱정된다면 체크섬으로 충분합니다. 내용을 바꿔서 이득을 볼 상대가 있다면 비밀 키나 개인 키를 쓰는 쪽으로 가야 합니다.
검증값을 아예 붙이지 않는 경우도 있습니다. 한 프로세스 안에서 만들고 바로 쓰는 값처럼 밖으로 나가지 않는 데이터가 그렇습니다. 계산과 보관 비용을 치를 만큼 얻는 것이 없습니다.
관련 항목
무결성을 확인하는 데 쓰는 도구
해시 함수 · 체크섬 · 메시지 인증 코드 · HMAC · 전자 서명 · 개인 키 · 공개 키 · 순환 중복 검사 · SHA-1 · 머클 트리
무결성과 나란히 세우는 보안 성질
기밀성 · 가용성 · 인증 · 부인 방지 · 최소 권한
무결성을 깨뜨리는 공격과 고장
중간자 공격 · 재전송 공격 · 비트 부패 · 변조 · 데이터 손상
무결성을 지키며 데이터를 나르는 프로토콜
TLS · HTTPS · SSH · IPsec · 인증 암호
저장된 데이터의 무결성을 지키는 방법
데이터 스크러빙 · ECC 메모리 · RAID · 백업과 복구 · 오류 정정 부호
데이터베이스가 지키는 무결성 규칙
참조 무결성 · 개체 무결성 · 도메인 무결성 · 제약 조건 · 기본 키 · 트랜잭션
무결성 검증을 얹어 만든 구조
다른 이름: integrity · data integrity · 데이터 무결성