shasum?
shasum
은 SHA 해시 암호 알고리즘을 사용해서 암호화된 데이터(다이제스트)를 생성하는 프로그램이다.
원본 파일이 변경되었는지 검사하는 체크섬(checksum) 검사에 주로 사용된다.
간단한 예시는 다음과 같다.
1
hello
위와 같은 텍스트를 저장하고 shasum
을 수행하면 다음과 같은 값이 저장된다.
1
f572d396fae9206628714fb2ce00f72e94f2258f
여기서 텍스트를 다음과 같이 변경한다.
1
hello world
다시 shasum
을 실행하면 다음과 같이 값이 바뀐다.
1
22596363b3de40b06f981fb85d82312e8c0ed511
파일의 내용이 변경되면 shasum
을 수행한 결과가 달라지는 것은 단방향 해시 함수이기 때문이다.
인터넷에서 다운 받은 파일은 바이러스에 감염되어있거나 악성코드가 포함되어 있을 수도 있어서 바이러스 검사를 하지 않고 실행하는 것은 위험하다.
그래서 원본 파일과 검사할 파일을 shasum
을 이용해서 값을 비교하는 것이다. 실제 예시로는 게임 회사에서 정품 확인 여부를 확인할 때 게임 배포 시 체크섬 파일을 함께 포함하는 것이 있다.
체크섬(checksum)?
체크섬(checksum)은 수신한 데이터가 중복 또는 훼손이 되었는지 확인하여 데이터에 결함이 없는지 확인하는 단순한 방법이다. 주로 네트워크 통신에서 사용된다.
네트워크에서 체크섬을 사용하는 이유는 패킷이 전송되는 도중에 목적지가 아닌 다른 곳으로 도착하거나, 네트워크 혼잡에 의해 도착하는 순서가 달라질 수 있기 때문이다. 또는, 중간에 누군가 패킷을 가로채서 잘못된 데이터를 보내는 것을 방지하기 위해서도 사용한다. 그림으로 표현하면 다음과 같다.
체크섬은 2의 보수를 활용해서 계산할 수 있는데, 예시는 다음과 같다.
0x25
,0x62
,0x3F
,0x52
라는 4바이트 데이터가 있다. (10진수로 37, 98, 63, 82)- 모든 바이트를 더하면
0x118
이 된다. (10진수로 280) 0x118
은 2진수로0001 0001 1000
이다.- 1바이트의 절반인 캐리 니블(최상위 4비트)을 버리면
0x18
(~~0001~~ 0001 1000
)이 된다. (10진수로 24) - 2의 보수는 1의 보수 값에 +1 을 한 것이다. 1의 보수(XOR)를 구하면 다음과 같다.
1 2 3 4
1111 1111 0001 1000 --------- 1110 0111
그리고 1의 보수를 구한 값에 +1 을 하면 다음과 같다.
1 2 3 4
1110 0111 0000 0001 --------- 1110 1000
1110 1000
을 16진수로 변환하면0xE8
이다. 이 값을 체크섬 바이트라 한다. (10진수로 232)- 원래 그룹의 바이트와 체크섬 바이트를 더하면
0x118
+0xE8
=0x200
(10진수로 512)이다. 이를 2진수로 변환하면0010 0000 0000
이다. - 여기서 다시 캐리 니블을 버리면
~~0010~~ 0000 0000
즉,0x00
이 된다. - 0이 나오면 송신 측에서 보낸 정보와 수신 측에서 받은 정보가 동일하다는 의미이다.
참고자료
- sha1sum [wikipedia]
- SHASUM Command on Linux [linuxhint]
- 체크섬 [위키백과]
- [아두이노] 체크섬(Checksum), 튀는 값 잡는 방법 [네이버 블로그]