我想确保没有人更改文件。为了实现这一点,我不仅要检查文件的 MD5 值,还要检查其大小,因为据我所知,这个额外的简单检查可以通过几位数字来伪造。
我可以相信返回的大小stat
吗?我不是说它stat
本身是否发生了变化。我不去那深。但是,例如,有人可以stat
通过破解目录文件来损害返回的文件大小吗?或者通过类似方法,不需要超级用户权限?
它是 Linux。
答案1
你问是否有人可以通过以下方式泄露 stat 返回的文件大小破解目录文件。不,这不可能。目录只是文件名和 inode 编号的列表。所有其他文件信息(所有者、组、模式、大小等)都包含在 inode 中(至少在符合 POSIX 的文件系统中),stat 就是从那里收集这些信息的。
答案2
下面是稀疏文件的演示,其大小可能会产生误导:
$ dd if=/dev/zero of=sparse.out bs=512 seek=100000 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 7.5053e-05 s, 0.0 kB/s
$ echo hi>>sparse.out
$ ls -l sparse.out
-rw-r--r-- 1 user group 51200003 2010-04-13 02:09 sparse.out
$ stat sparse.out
File: `sparse.out'
Size: 51200003 Blocks: 24 IO Block: 4096 regular file
Device: 802h/2050d Inode: 1111111 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1111/ user) Gid: ( 1111/ group)
Access: 2010-04-13 02:09:11.000000000 -0500
Modify: 2010-04-13 02:09:09.000000000 -0500
Change: 2010-04-13 02:09:09.000000000 -0500
$ hexdump -C sparse.out
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
030d4000 68 69 0a |hi.|
030d4003
$ du sparse.out
12 sparse.out
如您所见,ls
和中的字节数stat
显示分配的空间,但只有的块数stat
和的输出du
才接近文件的实际内容。
答案3
你为什么要关心文件的大小?比较 MD5 总和可以绝对肯定地告诉你文件是否已更改。翻转文件内的位将保留文件大小,但可能是完全不同的文件。