在 Ubuntu 等 Linux 或 Unix 系统中,md5sum 是用来计算和校验文件的工具.
MD5 全称 Message-DigestAlgorithm 5,报文摘要算法. 该算法对任意长度的信息进行逐位计算,产生一个二进制长度128位(十六进制长度32位)的校验和(或称“指纹”,“报文摘要”),不同的文件内容生成相同的报文摘要的概率是极其小的.
MD5 算法一般用于检查文件完整性,尤其常用于检测在网络文件传输、拷贝、磁盘错误或其他无恶意涉入的情况下文件的正确性.
md5sum 命令用于生成和校验文件的md5值. 会逐位对文件的内容进行校验,是文件的内容,与文件名无关. 也就是文件内容相同,其md5值相同. md5 值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值. 比如,检验文件时,对比源文件和目标文件的 md5sum,如果一致,则认为文件是同一文件.
md5 校验,有很小的概率不同的文件生成的 md5 可能相同. 比md5更安全的校验算法还有SHA*系列的.
注:
[1] - md5sum 是校验文件内容,与文件名是否相同无关.
[2] - md5sum值逐位校验,所以文件越大,校验时间越长.
1. md5sum 参数
用法:
md5sum [OPTION]... [FILE]...
作用:打印或校验 MD5(128-bit) 校验码(checksums).
md5sum --help
md5sum --version
参数:
[1] - -b
, --binary
, 以二进制模式读入文件内容.
[2] - -t
, --text
, 以文本模式读入文件内容(默认).
[3] - -c
, --check
, 根据已生成的 md5 值,校验已有文件.
[4] - --tag
, 创建 BSD-style checksum.
[5] - --ignore-missing
, 对于丢失文件不记录其状态(仅用于文件校验).
[6] - --quiet
, 对于每个成功校验的文件不打印 OK(仅用于文件校验).
[7] - --status
, 校验完成后,不输出错误或正确等提示信息(仅用于文件校验).
[8] - --strict
, 对于格式不正确的 checksum 行,退出非零(exit non-zero)(仅用于文件校验).
[9] - -w
, --warn
, 对于格式不正确的 checksum 行,警告提示(仅用于文件校验).
2. md5sum 用例
2.1. 查看文件 md5 值
#用法:
md5sum file
md5sum * # 输出当前文件夹内所有文件的 md5 值.
#如
md5sum a361939080f540eca25bda3328d588fd.png
#输出:
#89c4f637d852200d653b59f9477e9a0e a361939080f540eca25bda3328d588fd.png
md5sum 校验的是文件内容,与文件名无关.
可以文本模式或二进制模式读入文件并对其进行校验. 虽然是不同的读入模式,但是在进行求md5的时候,是一样的,都是逐位校验. 例如:
file a361939080f540eca25bda3328d588fd.png
#输出:
#a361939080f540eca25bda3328d588fd.png: PNG image data, 800 x 800, 8-bit colormap, non-interlaced
md5sum -b a361939080f540eca25bda3328d588fd.png
#89c4f637d852200d653b59f9477e9a0e *a361939080f540eca25bda3328d588fd.png
md5sum -t a361939080f540eca25bda3328d588fd.png
#89c4f637d852200d653b59f9477e9a0e a361939080f540eca25bda3328d588fd.png
2.2. 单个文件的 md5 值保存到指定文件
将生成md5值保存到指定的文件,通常文件的扩展名会命为.md5(文本文件).
如:
#重定向 md5 值到文本文件.
md5sum a361939080f540eca25bda3328d588fd.png > a361939080f540eca25bda3328d588fd.png.md5
#查看.md5 文件内容
cat a361939080f540eca25bda3328d588fd.png.md5
#89c4f637d852200d653b59f9477e9a0e a361939080f540eca25bda3328d588fd.pn
2.3. 多个文件的 md5 值保存到指定文件
将多个文件的md5 保存到指定的文件,每个文件的md5生成为一行.
如:
md5sum * >> out.md5
cat out.md5
#输出,每一行为一个文件.
#89c4f637d852200d653b59f9477e9a0e a361939080f540eca25bda3328d588fd.png
#b5b6cbfe0083360e8391d06b834b4899 a361939080f540eca25bda3328d588fd.png.md5
2.4. md5 校验
根据已生成的md5来进行校验。生成当前文件的md5,并和之前已经生成的md5进行对比,如果一致,则返回OK,否则返回错误信息.
如:
md5sum -c out.md5
#输出
#a361939080f540eca25bda3328d588fd.png: OK
#a361939080f540eca25bda3328d588fd.png.md5: OK
md5sum -c --status out.md5 # 不打印任何信息
2.5. 与 grep 命令并用以校验多个文件
如:
md5sum -c out.md5 | grep -v OK #grep 命令过滤正确的信息
#输出:
#a361939080f540eca25bda3328d588fd.png.md5: FAILED
#md5sum: WARNING: 1 computed checksum did NOT match
3. Python库 hashlib 校验 md5 值
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import hashlib
def md5sum(filename):
f = open(filename, 'rb')
md5 = hashlib.md5()
while True:
fb = f.read(8096)
if not fb:
break
md5.update(fb)
f.close()
return (md5.hexdigest())
如:
md5sum("a361939080f540eca25bda3328d588fd.png")
#输出
#'89c4f637d852200d653b59f9477e9a0e'