python 哈希

python中计算哈希值主要包含两个模块,crypt(不常用)和hashlib(常用),在工作过程中,经常使用计算哈希值的方式校验文件的完整性或者对文件的加解密等

模块介绍

crypt模块

主要方法和常量

  1. 方法
    1. crypt(…):对指定内容进行hash加密
    2. methods(…):返回可用加密算法的列表
    3. mksalt(…):根据加密算法生成salt
  2. 常量
    1. METHOD_MD5:md5加密算法
    2. METHOD_CRYPT
    3. METHOD_BLOWFISH(python3.7增加)
    4. METHOD_SHA256:sha256加密算法
    5. METHOD_SHA512(最强):sha512加密算法

使用方法

使用crypt.crypt(…)进行hash加密的时候,需要提供二个参数: 加密内容和salt,如果不特别指定salt,系统就会调用crypt.mksalt(…)生成一个salt,如果想要以特定的加密算法生成salt,则使用以下方式:

import crypt

salt=crypt.mksalt(crypt.METHOD_MD5)
hashstr=crypt.crypt("need hash value",salt)
print(hashstr)

# $1$P2dUkaFr$NVqTeHPko6M7gMSlpaeKv.

hashlib

主要方法

  1. md5(…):利用md5算法加密
  2. sha1(…):利用sha1算法加密
  3. sha224(…):利用sha224算法加密
  4. sha256(…):利用sha256算法加密
  5. sha384(…):利用sha384算法加密
  6. sha512(…):利用sha512算法加密
  7. update(arg):可以重复利用指定了特殊加密算法的Hash对象,对arg进行加密用于逐段读取大文件时,实现对整个大文件的哈希计算
  8. digest(…):以字符形式返回加密内容
  9. hexdigest(…):以16进制形式返回加密内容
  10. copy(…):为了达到重复利用Hash对象的目的,而克隆Hash对象

使用方法

import hashlib

m = hashlib.md5()
m.update("need hash value".encode('utf-8'))
mdig=m.digest()
mhex=m.hexdigest()
print(mdig)
print(mhex)

# b'\x05\xb4D\x84\xe6\xcde\xdd\xc1|\xa0T\x80*\xd6\x0b'
# 05b44484e6cd65ddc17ca054802ad60b

计算文件的哈希

MD5是一种消息摘要算法,用于从可变输入数据中创建唯一的固定大小值。MD5通常用于检查文件在传输过程中是否损坏(在这种情况下,哈希值称为校验和),文件中的任何更改都将导致不同的MD5哈希值

小文件的MD5哈希值

import hashlib
 
filename=input("输入文件: ")
with open(filename,"rb") as f:
    bytes=f.read() # 将文件一次性读入内存
    readable_hash=hashlib.md5(bytes).hexdigest()
    print(readable_hash)
    readable_hash=hashlib.sha1(bytes).hexdigest()
    print(readable_hash)


# 输入文件: D:\VM\cn_windows_server_2016_x64_dvd_9718765.iso
# 4f1e348b1333a19169f16145635c36c1
# 6ae9ce84c9a97cfa55372b2892903a214062d5e5

由于在计算MD5哈希值之前将整个文件读取到内存中,上述代码对于大型输入文件可能会失败

大文件的MD5哈希值

import hashlib
 
filename=input("输入文件: ")
md5_hash=hashlib.md5()
with open(filename,"rb") as f:
    for byte_block in iter(lambda: f.read(4096),b""):  # 每次读入4K
        md5_hash.update(byte_block)
    print(md5_hash.hexdigest())

# 输入文件: D:\VM\cn_windows_server_2016_x64_dvd_9718765.iso
# 4f1e348b1333a19169f16145635c36c1

调用7zip来计算哈希值

使用该方法之前需要先将7zip安装目录添加到环境变量中
如果为了大文件传输前后的哈希值,需要较快的计算出哈希值,此时python自带的模块可能在速度上来不及,可以使用7zip的命令行工具
语法格式:7z h [-scrc{Method}] [files]-scrc参数指定计算的方法,支持的方法有CRC32、CRC64、SHA1、SHA256,默认是CRC327zip不支持MD5,可以使用SHA1

import os,re

filename=input("输入文件: ")
readable_hash=os.popen(f"7z h -scrcSHA1 \"{filename}\"").read()
# 用正则匹配提取SHA1哈希值,其他算法不能使用此方法提取,可根据返回值进行适当调整
res=re.findall("[0123456789ABCDEF]{40}",readable_hash)[0]
print(res)

# 输入文件: D:\VM\cn_windows_server_2016_x64_dvd_9718765.iso
# 6AE9CE84C9A97CFA55372B2892903A214062D5E5

调用HashMyFiles来计算哈希值

除此之外,还可以使用调用HashMyFiles来实现计算hash值,此工具也有命令行模式,且支持的哈希算法更全面
下载网站和命令行使用方法参考:http://www.nirsoft.net/utils/hash_my_files.html