체크섬/해시를 모두 수행하려면 다음과 같이 작동합니다.

체크섬/해시를 모두 수행하려면 다음과 같이 작동합니다.

내가 아는 한, 파일의 작은 부분이라도 변경하면 전체 체크섬 결과가 변경되지만 파일 이름을 변경하면 체크섬에 영향을 미치지 않습니다(SHA-1, SHA-256 및 MD5를 시도했습니다).

왜? 파일 이름이 파일 데이터의 일부가 아닌가요? 파일 시스템에 따라 달라지나요?

답변1

파일 이름은 디렉토리 항목의 문자열이며 기타 많은 메타데이터(파일 유형, 권한, 소유권, 타임스탬프 등)가 inode에 저장됩니다. 따라서 파일 이름은 파일을 구성하는 실제 데이터의 일부가 아닙니다. 실제로 단일 파일은 파일 시스템에서 원하는 수의 이름(하드 링크)을 가질 수 있으며 임의의 이름이 지정된 여러 기호 링크를 통해 액세스할 수도 있습니다.

md5파일 이름은 파일 데이터의 일부가 아니기 때문에 md5sum또는 유사한 유틸리티를 사용하여 MD5 체크섬을 계산할 때 자동으로 포함되지 않습니다.

따라서 파일 이름(또는 소유권, 타임스탬프, 권한 등)을 변경하거나 다른 이름이나 심볼릭 링크(있는 경우) 중 하나를 통해 파일에 액세스해도 파일의 MD5 체크섬에 아무런 영향을 미치지 않습니다.

답변2

예, 말씀하신 대로 "파일 이름은 파일 데이터의 일부가 아닙니다"

파일 이름을 저장할 수 없습니다존재하다문서. 그렇다면 파일이 변경됩니다. 그러나 파일 이름, 기타 메타데이터 및 파일 데이터를 체크섬하는 것이 유효할 수 있지만 일반적으로 나쁜 생각입니다.

파일 이름은 포함된 디렉터리의 일부입니다. 파일의 일부가 아닙니다.

체크섬/해시를 모두 수행하려면 다음과 같이 작동합니다.

(아마도 좋은 생각은 아닐 것임)

echo "$filename" | xargs -n1 -I{} bash -c 'echo "$1"; cat "$1"' x {} | shasum

답변3

파일 이름을 변경해도 체크섬에는 영향이 없습니다(SHA-1, SHA-256 및 MD5를 사용해 보았습니다).

글쎄, 그것은 약간 잘못된 연결입니다. SHA-1, SHA-256 및 MD5는 파일이나 파일 이름을 해시하지 않고 대신 비트스트림을 해시합니다. 따라서 귀하가 얻는 결과는 전적으로 귀하가 제공하기로 선택한 입력에 따라 달라지며 이를 표시하지 않습니다.

이제 실제로 해시할 데이터에 지정된 파일의 내용만 포함하는 sha1sum, sha256sum및 유틸리티를 사용했을 수 있습니다 . md5sum파일 이름이나 권한 비트, 소유자 정보, 타임스탬프 또는 기타 메타데이터가 아닙니다.

하지만 그것은 진실이 아니다가지다그렇게. 다음은 두 파일의 SHA-256 해시와 해당 이름입니다.

$ echo hello > a.txt; cp a.txt b.txt
$ ./checksum.sh a.txt  b.txt 
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca  -
bad46702033923726add35ef8d97570f1aa40d93dad1d6ba63e7b051a34b9efc  -

스크립트는 단순히 파일 이름을 해시된 데이터 앞에 추가합니다. 다른 애플리케이션은 파일 콘텐츠와 함께 해시 입력에 메타데이터를 포함하거나 데이터의 일부만 포함하는 해시를 포함할 수 있습니다.

분명히 파일 이름을 포함하면 동일한 파일이라도 다른 이름으로 참조될 수 있으므로 해시가 다양하다는 단점이 있습니다.

/tmp/test$ ./checksum.sh a.txt ./a.txt /tmp/test/a.txt 
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca  -
85ec58226886f4f853212b2d21bb2fb72447813ac13a59e9376b2e0c02074839  -
25c1c072481131e07c3fc20d16109472872233f658f4df3c4982fb195a048b96  -

타임스탬프, 소유자 등을 방정식에 추가하면 파일을 다른 시스템에 복사한 후 해시가 달라지게 되어 해시의 유용성이 매우 의심스러워집니다. 파일 이름도 누락되거나 변경될 수 있습니다.

해시에 메타데이터를 포함하려는 경우 가장 쉬운 방법은 파일을 tar 아카이브나 유용하다고 생각되는 메타데이터를 저장하는 다른 컨테이너에 넣은 다음 해시하고 복사하는 것입니다. 아카이브에서 파일(콘텐츠)을 추출한 후 파일 시스템의 메타데이터가 다를 수 있지만 파일이 제공된 아카이브를 계속 확인할 수 있습니다.


위 스크립트는 다음과 같습니다.

$ cat checksum.sh
#!/bin/bash
for f in "$@"; do
        (printf "%s\0" "$f" ; cat "$f") | sha256sum - 
done

답변4

당신이 말했듯이 이제 두 답변 모두에서 강조되었습니다. 파일 이름은 데이터의 일부가 아니라 파일에 대한 데이터(일명 메타데이터)입니다.

이는 실제로 유용합니다. 이렇게 하면 이름이 다르더라도 중복 항목을 감지할 수 있기 때문입니다. fdupes중복 항목 검색과 같은 프로그램은 jdupes실제로 프로세스 속도를 높이기 위해 체크섬을 사용합니다(체크섬은 소위 불변입니다).

관련 정보