[JAVA] MessageDigest를 이용하여 파일 무결성 검사하기.

[JAVA] MessageDigest를 이용하여 파일 무결성 검사하기.

평소에 접속하던 사이트에 이미지가 표시되지 않는 현상이 발생했다.

이미지가 표시되지 않아 나는 여러번 새로고침을 눌렀으나 여전히 이미지는 회색 박스로 표시되었다.

인터넷에 검색을 이런저런 검색을 해보니 인터넷 옵션에서 캐시파일을 삭제하고 재접속을 해보라는 것이었다.

나는 곧 바로 캐시파일을 삭제하였고 다시 접속하였을 때 이미지가 정상적으로 표시되는 것을 볼 수 있었다.

왜 이런현상이 생길까라는 궁금증이 생겼고 사수 분과 이런저런 얘기를 나누었다.

얘기 중에 데이터 무결성에 대한 얘기를 듣게 되었고

무결성 검사를 통해서 파일의 데이터가 정상적으로 받아졌는지 확인할 필요가 있다는 말을 들었다.

데이터 무결성이란

데이터베이스에 저장된 데이터 값과 그것이 표현하는 현실 세계의 실제값이 일치하는 정확성을 의미한다.

그 말은 내가 사이트 서버로부터 받은 이미지가 어떠한 이유로 꼬여버려 져서 사이트에서

원래 표시되어야 할 이미지가 표시되지 못하고 있다는것.

나는 무결성 검사 방식에 대해 궁금해서 알아보던 중 해쉬 함수를 이용하여 무결성 검사를 하는 방법이

있다는 것을 알게 되었다.

그래서 이것저것 찾아보고 JAVA의 MessageDigest클래스를 이용하여 파일 무결성 검사하는 것을 구현해보았다.

실험에 이용될 안드로이드 이미지 파일이다.

파일 두 개를 만들어 놓았다.

이상태로 내가 만들어 놓은 코드를 실행시켜 보겠다.

코드

//파일 객체생성 File android1 = new File("C:/Android_logo.png"); File android2 = new File("C:/Android_logo2.png"); try { //SHA-256 다이제스트 객체 MessageDigest md = MessageDigest.getInstance("SHA-256"); //파일로부터 스트림 읽기 InputStream in1 = new FileInputStream(android1); InputStream in2 = new FileInputStream(android2); //해쉬변환된 문자열 담을 객체생성 StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); //데이터를 담을 바이트배열 byte[] imageByte1 = new byte[1024]; byte[] imageByte2 = new byte[1024]; //인풋스트림의 데이터를 바이트배열에 담음 in1.read(imageByte1); in2.read(imageByte2); //이미지1 해쉬문자열 변환 md.digest(imageByte1); for (byte data : imageByte1) { sb1.append(Integer.toString((data & 0xff) + 0x100, 16)); } //이미지2 해쉬문자열 변환 md.digest(imageByte2); for (byte data : imageByte2) { sb2.append(Integer.toString((data & 0xff) + 0x100, 16)); } //변환된 문자열 출력 System.out.println("해쉬변환된 문자열1 : " + sb1); System.out.println("해쉬변환된 문자열2 : " + sb2); //변환된 문자열이 같다면 if (sb1.toString().equals(sb2.toString())) System.out.println("해쉬값 : 같음"); else System.out.println("해쉬값 : 다름"); } catch (NoSuchAlgorithmException | IOException e) { e.printStackTrace(); } //파일의 크기 long size1 = android1.length(); long size2 = android2.length(); //파일의 크기 출력 System.out.println("파일1 사이즈 : " + size1); System.out.println("파일2 사이즈 : " + size2); if (size1 == size2) System.out.println("사이즈 : 같음"); else System.out.println("사이즈 : 다름");

변환된 데이터의 대한 해쉬 문자열이 같아 같다고 나오며

크기 또한 같아 같다고 나온다.

이제 2번 파일을 조금 수정해 보겠다.

기존에 존재했던 이미지 파일을 삭제하고 크기가 똑같은 빈 파일을 생성하여서 다시 한번 코드를 실행해보았다.

결과는 변환된 데이터에 대한 해쉬 문자열이 다르기 때문에 다르다고 나오고

파일의 사이즈가 같기 때문에 사이즈에 대해서는 같다고 표시된다.

이번 실험을 통해서 겉으로 판단하기보다는 내용을 확인하여서 확인하는 것이 확실하고 안전할 것 같다는 생각을 했다.

이 방법 말고 무결성 검사를 하는 다른 방법이 존재할 거라 생각한다. 시간이 나면 찾아보고 공부해봐야겠다.

참고사이트

https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html

https://workoff-dad.tistory.com/entry/java-%ED%8C%8C%EC%9D%BC-%ED%95%B4%EC%8B%9Chash-%EA%B0%92-%EB%A7%8C%EB%93%A4%EA%B8%B0

from http://charlie-dev.tistory.com/8 by ccl(A) rewrite - 2021-12-12 21:01:32