Python 加密与解密实战 18 招(四):文件加密·扩展算法·安全随机数
2026/7/7 3:05:10 网站建设 项目流程

Python 加密与解密实战 18 招(四):文件加密·扩展算法·安全随机数

系列文章导航

  • 第一篇:散列哈希加密(招式1-4)
  • 第二篇:对称加密(招式5-9)
  • 第三篇:非对称加密·数字签名·密钥交换(招式10-13)
  • 第四篇:文件加密·扩展算法·安全随机数(招式14-18) ← 当前

前言

本篇是系列的收官之作,涵盖5 个招式:文件签名与完整性校验、文件加密、扩展加密算法(ARC4/CAST5/ChaCha20/Camellia/SM4/ECC),以及密码学安全随机数生成。


招式14:hashlib 库实现文件签名

14.1 文件哈希签名原理

文件签名通过对文件内容计算哈希值,生成唯一"指纹",用于:

  • 完整性校验:检测文件是否被篡改
  • 去重判断:相同内容的文件哈希相同
  • 版本标识:快速判断文件版本

14.2 一次性读取文件哈希

importhashlib test_file="/root/crypto_lab/test_document.txt"# 方法1: 一次性读取整个文件计算哈希withopen(test_file,'rb')asf:file_data=f.read()md5_hash=hashlib.md5(file_data).hexdigest()sha256_hash=hashlib.sha256(file_data).hexdigest()sha512_hash=hashlib.sha512(file_data).hexdigest()print(f"MD5:{md5_hash}")print(f"SHA256:{sha256_hash}")print(f"SHA512:{sha512_hash}")

运行输出:

MD5: 1efe455e3dcd8c39c24bd51912afeee8 SHA256: 3ee001c0762628deb92e73709d22e8f06f17289d1ede3db8969f9f0a291a6195 SHA512: 7404183d72cbc2d99a659e8f808e7a8fb88322cc4c0dd3233a74ffc5d95b5e5ade8c5486809270055f779af10b0db0130b7c7868b1d33e845d5dc69faf84b540

14.3 分块读取大文件

处理 GB 级大文件时,必须分块读取:

importtimedeffile_hash(filepath,algorithm='sha256',chunk_size=8192):h=hashlib.new(algorithm)withopen(filepath,'rb')asf:whileTrue:chunk=f.read(chunk_size)ifnotchunk:breakh.update(chunk)returnh.hexdigest()start=time.time()result=file_hash(test_file,'sha256')elapsed=time.time()-startprint(f"分块SHA256:{result}")print(f"耗时:{elapsed:.6f}秒")

运行输出:

分块SHA256: 3ee001c0762628deb92e73709d22e8f06f17289d1ede3db8969f9f0a291a6195 耗时: 0.000022秒

14.4 多种哈希算法文件签名

print("--- 多种哈希算法文件签名 ---")foralgoin['md5','sha1','sha224','sha256','sha384','sha512','sha3_256','sha3_512','blake2b','blake2s']:h=file_hash(test_file,algo)print(f"{algo:12s}:{h[:48]}...")

运行输出:

md5 : 1efe455e3dcd8c39c24bd51912afeee8... sha1 : 750cb423f9b7660e826e62dcb5c434286c6d2742... sha224 : 5c1d1d20fd2bf31a8225f32c1d35645b15ce067b16bec5fa... sha256 : 3ee001c0762628deb92e73709d22e8f06f17289d1ede3db8... sha384 : e96e335c87fcb36693c10e5cf4e0677cee1439bc4b54f5a3... sha512 : 7404183d72cbc2d99a659e8f808e7a8fb88322cc4c0dd323... sha3_256 : 831a43cb141b54e22a0febd0192cd6b476142e2ce9cba3bd... sha3_512 : 1066236e8ab86bfdf10435283d7a9183c8c7185c3f4b7b09... blake2b : a63596e3a9f076bfee6c72d8fdcee4d2916b9884f0d4c55f... blake2s : c27ddefde70f7df7e2d1f3372ccb2c9c3ab24872668e56c6...

14.5 HMAC 文件签名与完整性验证

importhmac secret_key=b"file_signing_secret_key"withopen(test_file,'rb')asf:file_hmac=hmac.new(secret_key,f.read(),hashlib.sha256).hexdigest()print(f"HMAC-SHA256:{file_hmac}")# 文件完整性验证original_hash=file_hash(test_file,'sha256')current_hash=file_hash(test_file,'sha256')print(f"文件完整性:{'通过'iforiginal_hash==current_hashelse'失败'}")

运行输出:

HMAC-SHA256: 7196b30017395acb4b9019a716e35e57be95def88ec433db696178ae864b73ec 文件完整性: 通过

小结:文件哈希是完整性校验的基础。大文件使用分块读取(chunk_size=8192是典型值)。HMAC 签名提供带密钥的认证,防止攻击者篡改文件后重新计算哈希。


招式15:cryptography 库实现文件签名

15.1 RSA-PSS 文件数字签名

数字签名不仅能验证完整性,还能验证签名者身份:

fromcryptography.hazmat.primitives.asymmetricimportrsa,padding,ecfromcryptography.hazmat.primitivesimporthashesfromcryptography.hazmat.backendsimportdefault_backend# 生成RSA密钥对private_key=rsa.generate_private_key(65537,2048)public_key=private_key.public_key()# 读取文件withopen(test_file,'rb')asf:file_data=f.read()# 使用RSA-PSS对文件进行数字签名signature=private_key.sign(file_data,padding.PSS(mgf=padding.MGF1(hashes.SHA256()),salt_length=padding.PSS.MAX_LENGTH),hashes.SHA256())print(f"签名长度:{len(signature)}字节")print(f"签名(hex前60字符):{signature.hex()[:60]}...")# 验证签名sig_file=test_file+".sig"withopen(sig_file,'wb')asf:f.write(signature)print(f"签名已保存到:{sig_file}")withopen(sig_file,'rb')asf:loaded_sig=f.read()try:public_key.verify(loaded_sig,file_data,padding.PSS(mgf=padding.MGF1(hashes.SHA256()),salt_length=padding.PSS.MAX_LENGTH),hashes.SHA256())print("签名验证: 有效")exceptException:print("签名验证: 无效")# 篡改文件后验证tampered_data=file_data+b"TAMPERED"try:public_key.verify(loaded_sig,tampered_data,padding.PSS(mgf=padding.MGF1(hashes.SHA256()),salt_length=padding.PSS.MAX_LENGTH

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询