文件完整性测试的解决思路和案例

简介:md5sum是一个在Unix和Unix-like操作系统下计算和校验文件MD5值的工具。它主要用于确保文件的完整性。MD5是一种常用的哈希函数,它可以生成一个固定长度(128位)的哈希值。在文件校验的场景中,我们可以通过比较文件的MD5哈希值来检查文件在传输或存储过程中是否被更改。

安装:在大多数Linux发行版中,md5sum工具是预装的,所以你可能不需要单独安装它。你可以通过输入以下命令来检查 md5sum 是否已经安装:

md5sum --version

Debian的系统(如Ubuntu),使用apt命令:

sudo apt-get install coreutils

对于基于Red Hat的系统(如Fedora或CentOS),使用yum命令:

sudo yum install coreutils

md5sum 的使用步骤:filename 是文件的名称。这条命令会输出一个 MD5 校验和,这是文件内容的唯一表示。

md5sum filename

获取了新的文件后(例如下载后的文件),再次计算文件的 MD5 校验和,然后与原始的 MD5 校验和进行比较。如果两个校验和相同,那么文件没有被更改。如果校验和不同,那么文件可能在传输或存储过程中被更改。

注意事项:MD5不适用于需要高度安全性的场景,因为它已被证明存在碰撞问题(即不同的输入可能会产生相同的输出)。如果你需要更高的安全性,可以考虑使用SHA-256等更安全的哈希函数

案例:通过检查,我们发现前后hash均为a981130cf2b7e09f4686dc273cf7187e ,即完全上传下载传输过后,文件是完整的

  1. (base) [root@572ysx2s check-file-size]# fallocate -l 2G myfile-01.img # 创建一个文件

  2. (base) [root@572ysx2s check-file-size]# ls -lh # 查看文件大小

  3. total 2.1G

  4. -rw-r--r-- 1 root root 2.0G Jun 1 10:30 myfile-01.img

  5. (base) [root@572ysx2s check-file-size]#

  6. (base) [root@572ysx2s check-file-size]# md5sum myfile-01.img # 通过md5sum 查看文件hash

  7. a981130cf2b7e09f4686dc273cf7187e myfile-01.img

  8. # 注:上传这个文件,此处忽略

  9. (base) [root@ci4vyvxi572ysx2s check-file-size]# cp -r myfile-01.img myfile-02.img # 拷贝、远程拷贝或者下载这个文件。

  10. (base) [root@572ysx2s check-file-size]# md5sum myfile-02.img # 再次通过md5sum 查看文件hash

  11. a981130cf2b7e09f4686dc273cf7187e myfile-02.img

扩展案例:校验某路径下全部文件和完整性。处理某个路径下全部文件的大小和完整性,你可以遍历目标路径下的所有文件,并分别计算它们的大小和哈希值。以下是在 Linux 和 Python 中实现此任务的示例:

Linux案例:使用 find、du 和 md5sum 命令,可以很容易地在一个目录中递归地查找所有文件,计算它们的大小和 MD5 哈希值。

示例脚本:

find /path/to/directory -type f -exec du -sh {} \; -exec md5sum {} \;

在这个脚本中:

  • find /path/to/directory -type f 命令会查找指定目录中的所有文件(不包括目录)。

  • -exec du -sh {} \; 会对每个文件执行 du -sh 命令,计算文件的大小。

  • -exec md5sum {} \; 会对每个文件执行 md5sum 命令,计算文件的 MD5 哈希值。

    Python案例:使用 os 和 hashlib 模块来实现此任务。

    示例脚本:

  1. # -*- coding: utf-8 -*-

  2. # time: 2023/6/1 14:00

  3. # file: test.py

  4. # 公众号: 咖啡加剁椒

  5. import os

  6. import hashlib

  7. def get_file_md5(file_path):

  8. md5_hash = hashlib.md5()

  9. with open(file_path, "rb") as f:

  10. for byte_block in iter(lambda: f.read(4096),b""):

  11. md5_hash.update(byte_block)

  12. return md5_hash.hexdigest()

  13. def get_file_size(file_path):

  14. return os.path.getsize(file_path)

  15. def process_directory(directory_path):

  16. for root, dirs, files in os.walk(directory_path):

  17. for file in files:

  18. file_path = os.path.join(root, file)

  19. file_size = get_file_size(file_path)

  20. file_md5 = get_file_md5(file_path)

  21. print(f"File: {file_path}\nSize: {file_size} bytes\nMD5: {file_md5}\n")

  22. directory_path = "/path/to/directory"

  23. process_directory(directory_path)

在这个脚本中:

  • os.walk(directory_path) 函数递归地遍历指定目录的所有文件和子目录。

  • 对于每个文件,脚本会计算文件的大小和 MD5 哈希值,并打印结果。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值