컴퓨터에 대해 조금이라도 관심을 갖고 있는 사람이라면 대부분의 파일의 크기와 디스크 할당 크기가 다른 것을 알고 있을 것이다. 그 이유는 파일이 저장되는 최소 단위가 클러스터(Cluster)이기 때문이다. 만약 클러스터가 4096바이트라면 1바이트의 파일도 4096바이트 공간에 저장되고 4096바이트의 파일도 4096바이트 공간에 저장된다. 4097바이트의 파일이라면 8192바이트 공간에 저장된다. 그러므로 1바이트 파일이 디스크에 저장된다면 나머지 4095바이트가 낭비되는 셈. 이렇게 낭비되는 공간을 슬랙 공간(Slack Space)이라고 한다. 보통 줄여서 슬랙이라고 부른다.
클러스터의 크기는 NTFS < FAT32 < FAT16 순으로 크다. 즉, NTFS < FAT32 < FAT16 순으로 공간 낭비가 큰 셈.
휴지통은 특수한 폴더에 불과하다. 파일을 휴지통으로 버리는 것(이동하는 것)은 '휴지통'이라는 폴더로 이동하는 것일 뿐. 특수한 폴더이기 때문에 휴지통에 있는 파일을 지우면 삭제가 되고 일정 용량 이상되면 오래된 파일부터 지우는 기능 등을 지원한다.
윈도우에서는 파일/폴더를 선택하고 Shift + Delete 키를 누르면 영구적으로 삭제가 된다. 하지만 이것 역시 완전한 삭제가 아니다. 단지 파일 시스템의 파일에 대한 기록만 제거하는 것일 뿐이다. 즉, 데이터 - 시스템 간의 연결만 끊는 작업이다. 이렇게 하면 얻는 이득은 아래와 같다.
위와 같은 장점을 가지는 이유는 디스크 입장에서 삭제란 데이터를 0으로 기록하는 작업일 뿐이기 때문이다. 만약 데이터 - 시스템 간의 연결을 끊는 방법을 쓰지 않고 데이터를 0으로 기록하는 작업을 한다면 삭제 작업을 할 때에도 0으로 쓰는 작업을 하게 된다. 그리고 새로운 파일을 생성한다면 그 위에 데이터를 다시 기록할 것이다. 하지만 데이터 - 시스템 간의 연결을 끊는 방법을 쓴다면 단 한 번만 기록하면 된다. 원래 파일이 있던 공간에 새로운 파일을 다시 기록하고 연결만 해놓으면 땡이니깐.
대표적인 방법으로 일반 포맷과 빠른 포맷이 있다. 일반 포맷은 다시 로우 레벨 포맷, 하이 레벨 포맷으로 나눌 수 있는데 요즘은 로우 레벨 포맷은 거의 하지 않는 추세이다. 빠른 포맷 / 하이 레벨 포맷과 로우 레벨 포맷의 차이점은 다음과 같다.
그러므로 빠른 포맷으로 포맷하면 데이터 복구가 가능하다. 중고로 하드 디스크를 판매할 때에는 되도록 빠른 포맷으로 포맷하지 않도록 주의 하자.
위 내용을 이해하면 운영체제에서 파일을 삭제하면 파티션을 뒤져 데이터를 복구할 수 있다는 사실을 알 수 있다. 이 사실을 이용한 프로그램이 파일 복구 프로그램이다. 파일 복구 프로그램은 파티션의 모든 공간을 뒤져 파일을 찾고 그 정보를 파일 시스템과 연결해 준다. 하지만 지워진 파일 공간에 다른 데이터가 다시 기록되었다면 (0으로 기록하는 삭제 작업 포함) 파일 복구 프로그램으로는 복구할 수 없다.
파일을 지울 때 0x00(=0)으로 기록하거나(이를 제로필(Zero fill)이라 한다) 임의의 데이터로 기록하여 파일 복구 프로그램으로 복구할 수 없게 만드는 프로그램이다. 대표적인 프로그램으로 BCWipe가 있다. 그리고 디스크 또는 파티션 전체 공간을 대상으로 완전 삭제 작업을 진행하는 프로그램 또는 기능이 있다. 대표적인 프로그램 또는 기능으로 일반 포맷(빠른 포맷 아님), DiskPart 의 Clean All 작업, SDelete 등이 있다.
디스크는 자성체의 두 극 R과 N을 통해 0과 1을 구현한다. 그런데 아날로그인 R과 N값은 완벽하지 않다. 완벽한 R 상태의 값을 +10이라 하고 완벽한 N 상태의 값을 -10이라 하여, 값이 +10일 때 디지털 1, -10일 때 디티절 0이라고 가정하자. 하지만 완벽한 R 상태, N 상태가 아닌 경우가 많아서 값이 +9일 수도, -8일 수도 있다. 그래서 디스크는 허용 오차를 두어 +9인 값도 1, -8인 값도 0이라 처리한다. 그래서 아래와 같은 상황이 발생할 수 있다.
디스크의 아날로그 값을 분석하여 다음과 같은 결과를 얻었다.
실제 아날로그 값 | +11.1 | -8.9 | +9.1 | -11.1 | +10.9 | -9.1 |
---|---|---|---|---|---|---|
디지털 값 | 1 | 0 | 1 | 0 | 1 | 0 |
해석된 정보 | 범인은 철수 |
그런데 실제 아날로그 값과 이상적인 아날로그 값을(원래 해당 자성체가 가졌어야 할 값) 비교 분석하여 아래와 같은 놀라운 결과를 도출해낼 수 있다.
실제 아날로그 값 | +11.1 | -8.9 | +9.1 | -11.1 | +10.9 | -9.1 |
---|---|---|---|---|---|---|
이상적인 아날로그 값 | +10 | -10 | +10 | -10 | +10 | -10 |
두 값의 차이 | +1.1 | +1.1 | -0.9 | -1.1 | +0.9 | +0.9 |
차이를 다시 증폭한 아날로그 값 | +11 | +11 | -9 | -11 | +9 | +9 |
도출해낸 디지털 값 | 1 | 1 | 0 | 0 | 1 | 1 |
해석된 정보 | 사실은 영희지롱~ |
위는 쉬운 이해를 위해 실제 작업을 단순화시킨 것이다. 하지만 기본적인 원리는 위와 같다. 그러므로 제로필 같은 작업으로 완전히 복구가 불가능하게 하지 못한다.
디지털로 복구가 불가능해도 위에서처럼 아날로그로 복구가 가능할 수 있기 때문에 삭제 알고리즘도 여럿 생겨났다. 그 중 가장 대표적인 알고리즘이 DoD 5220.22-M(또는 DoD 5200.28-STD) 삭제 알고리즘이다. 이는 미 국방부의 DoD 5220.22-M 보안 문서라는 의미이다. 사실 DoD 5220.22-M은 삭제 알고리즘은 아니고 삭제 방법을 기술한 문서이다. 이 방법은 데이터 재기록 작업을 3번 또는 7번 하는 방식으로 흔적을 통한 복구 작업을 원천 차단한다. DoD 5220.22-M은 BCWipe나 시만텍사의 GDisk 등에서도 사용한다.
다음으로 유명한 알고리즘은 Peter Gutmann 삭제 알고리즘이다. 이 알고리즘은 데이터 삭제를 위해 35번의 재기록 작업을 수행한다. 그 수행 내용은 아래와 같다.
모든 프로그램에서 동일하다. 이 때 모든 공간은 지정한 공간에 따라 달라진다. 01. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 02. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 03. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 04. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 05. 모든 공간을 0x55 데이터로 덮어쓴다. 06. 모든 공간을 0xAA 데이터로 덮어쓴다. 07. 모든 공간을 세 바이트 씩 나눠 0x92, 0x49, 0x24 데이터로 덮어쓴다. 08. 모든 공간을 세 바이트 씩 나눠 0x49, 0x24, 0x92 데이터로 덮어쓴다. 09. 모든 공간을 세 바이트 씩 나눠 0x24, 0x92, 0x49 데이터로 덮어쓴다. 10. 모든 공간을 0x00 데이터로 덮어쓴다. 11. 모든 공간을 0x11 데이터로 덮어쓴다. 12. 모든 공간을 0x22 데이터로 덮어쓴다. 13. 모든 공간을 0x33 데이터로 덮어쓴다. 14. 모든 공간을 0x44 데이터로 덮어쓴다. 15. 모든 공간을 0x55 데이터로 덮어쓴다. 16. 모든 공간을 0x66 데이터로 덮어쓴다. 17. 모든 공간을 0x77 데이터로 덮어쓴다. 18. 모든 공간을 0x88 데이터로 덮어쓴다. 19. 모든 공간을 0x99 데이터로 덮어쓴다. 20. 모든 공간을 0xAA 데이터로 덮어쓴다. 21. 모든 공간을 0xBB 데이터로 덮어쓴다. 22. 모든 공간을 0xCC 데이터로 덮어쓴다. 23. 모든 공간을 0xDD 데이터로 덮어쓴다. 24. 모든 공간을 0xEE 데이터로 덮어쓴다. 25. 모든 공간을 0xFF 데이터로 덮어쓴다. 26. 모든 공간을 세 바이트 씩 나눠 0x92, 0x49, 0x24 데이터로 덮어쓴다. 27. 모든 공간을 세 바이트 씩 나눠 0x49, 0x24, 0x92 데이터로 덮어쓴다. 28. 모든 공간을 세 바이트 씩 나눠 0x24, 0x92, 0x49 데이터로 덮어쓴다. 29. 모든 공간을 세 바이트 씩 나눠 0x6D, 0xB6, 0xDB 데이터로 덮어쓴다. 30. 모든 공간을 세 바이트 씩 나눠 0xB6, 0xDB, 0x6D 데이터로 덮어쓴다. 31. 모든 공간을 세 바이트 씩 나눠 0xDB, 0x6D, 0xB6 데이터로 덮어쓴다. 32. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 33. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 34. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다. 35. 모든 공간을 임의의 랜덤한 데이터로 덮어쓴다.
일반적인 디스크에는 사용하지 않는 것이 좋다. 뭐.. 이렇게 데이터를 삭제할 시간에 다른 작업을 하거나 디스크를 뽀개버리겠지.
사실 위와 같은 삭제 알고리즘을 써서 복구가 불가능하게 할바에야 디스크를 망가뜨리는게 낫지 않을까 생각할 수도 있다. 그래서 MHDD같은 전문적인 하드 디스크 파괴 기기도 존재한다. 하지만 정부나 대기업 같은 곳에서 맘만 먹으면 복구할 수 있다. 이렇게 파일 복구가 불가능하게 하는 것보다 파일 암호화를 하는 것이 데이터 보호를 위해 더 효과적인 방법이 될 수 있다. 누군가 디스크를 훔쳐가도 데이터를 보기 위해선 복호화를 해야 하니깐.
그리고 여기에서 언급한 아날로그 복구 방법 내용은 하드디스크에 한정된 이야기이다. SSD나 플래시 메모리에는 해당되지 않는다. SSD에 제로필 작업을 하면 웬만하면 복구할 수 없다.