체크섬
은 전송 또는 저장 중에 발생할 수 있는 오류를 감지하기 위한 목적으로 임의의 디지털 데이터 블록에서 얻은 작은 크기의 데이터다.
일반적으로 다운로드 서버에서 설치 파일을 받은 후 설치 파일이 정상적인지 판단하는데 사용 되며, 종종 데이터 무결성을 확인하는 용도로 사용하기도 한다.
중요한건 체크섬 자체로는 데이터의 오류는 확인 할 수 있지만 데이터를 신뢰할 수 있는가는 확인 할 수가 없다.
HMAC
은 메시지인증코드(MAC) 해쉬를 기반으로 한 것이다. 메시지인증코드는 메시지인증에 쓰이는 정보 코드로 메시지 무결성 및 신뢰성을 보장하는 용도로 쓰인다.
HMAC은 Secret Key를 사용해서 신뢰성을 보장하는데 순서는 아래와 같다.
1. 사전에 Sender와 Reciver가 비밀키를 공유(Share key)와 사용할 해시함수 결정.
2. 보내고 싶은 메시지를 해시함수로 해시값으로 바꿈.
3. 해시값을 비밀키를 사용하여 HMAC값으로 변경.
4. HMAC값과 메시지를 같이 전송.
5. Reciver는 받은 메시지를 사용하여 2-3과정을 거쳐 HMAC값을 만듬.
6. Sender가 보낸 HMAC값과 Reciver가 만든 HMAC을 비교하여 검증.
여기서 왜 Secret Key가 신뢰성을 보장해 줄 수 있는 이유는 바로 같은 Key를 공유하기 때문이다. 해시 함수를 돌려서 나온 해시값을 내가 가지고 있는 Key로 암호화해서 같은 HMAC값이 나왔다는건 나와 같은 Key를 사용하는 사람이 보낸 메시지이므로 신뢰 할 수 있는 거다.
서명자가 해당 전자문서에 서명하였음을 나타내기 위해 전자문서에 첨부되거나 논리적으로 결합된 전자적 형태의 정보를 전자서명이라 한다. 전자서명은 수기서명과 동일한 효력을 지닌다. -위키백과
키를 사용한 암호화 방식은 대칭키와 비대칭키 방식이 있다.
간단하게 설명하면 대칭키는 sender와 reciver가 같은 키를 공유해서 그걸로 암호와/복호화를 하며 비대칭키는 sender가 reciver의 공유키를 가지고 암호화해서 보내고 reciver는 자신의 개인키로 복호화를 하는 것이다.
하지만 이렇게만 하면 누가 데이터를 보냈는지 알 수가 없지만 전자서명을 통해 알 수 있게 된다.
전자 서명은 배대칭 암호의 응용이며 서명은 자신의 비밀키(개인키)로만 가능하다.
먼저 비대칭키 방식에서 전자서명이 추가된 방식이다.
1. sender는 reciver의 공개키로 평문을 암호화.
2. sender는 자신의 비밀키(개인키)로 자신의 서명을 암호화함.
3. sender는 암호화된 데이터 + 서명을 reciver에게 보냄.
4. reciver는 자신의 비밀키(개인키)로 암호화된 데이터를 복호화.
5. reciver는 sender의 공개키로 서명을 복호화.
6. 4번이 성공했다는건 나한테 보낸 메시지가 맞다, 5번이 성공했다는건 sender가 보낸게 맞구나 하고 알 수 있다.
여기서 메시지의 변조가 있었는지 확인하기 위한다면 해시를 사용할 수 있다.
1. sender는 reciver의 공개키로 평문을 암호화.
2. sender는 자신의 비밀키(개인키)로 자신의 서명을 암호화함.
3. sender는 평문을 해시함수를 돌려 해시값을 얻음(체크섬).
4. sender는 암호화된 데이터 + 서명 + 해시값(체크섬)을 reciver에게 보냄.
5. reciver는 자신의 비밀키(개인키)로 암호화된 데이터를 복호화.
6. reciver는 sender의 공개키로 서명을 복호화.
7. reciver는 5번에서 얻은 평문을 해시함수를 돌려 얻은 해시값과 sender가 보낸 해시값이랑 비교.
8. 5번이 성공했다는건 나한테 보낸 메시지가 맞다, 6번이 성공했다는건 sender가 보낸게 맞다. 7번이 true면 메시지에 변조가 없었다 하고 알 수 있다.
한 줄평 : 체크섬은 무결성을 확인 할 수 있지만 신뢰하는 것은 별개의 문제고, HMAC은 무결성과 더불어 신뢰도 할 수 있다.
참고 -
https://www.sanfoundry.com/java-program-implement-checksum-method-small-string-messages-detect-if-received-message-same-transmitted/
https://webmaster-mi.tistory.com/128
https://www.inflearn.com/course/lecture?courseSlug=klaytn-%EC%8A%A4%EB%A7%88%ED%8A%B8%EA%B3%84%EC%95%BD%EA%B3%BC-%ED%83%88%EC%A4%91%EC%95%99%EC%95%B1&unitId=30497