泽兴芝士网

一站式 IT 编程学习资源平台

Python进阶教程第 30 章:安全编程、数据加密、哈希

30.1 引言

在处理用户数据、认证信息、网络通信等场景时,安全问题至关重要。
本章将学习:

  • 常见安全风险与防护
  • 使用哈希保证数据完整性
  • 使用对称加密和非对称加密
  • 安全地存储密码
  • Python 安全编程最佳实践

30.2 常见安全风险与防护


风险类型

描述

防护措施

代码注入

用户输入被直接执行

严格验证输入、使用安全库

数据泄露

敏感数据明文存储或日志泄露

使用加密存储、限制日志输出

弱密码/密码泄露

密码明文保存或算法过时

使用 bcrypt/scrypt 等强哈希

中间人攻击 (MITM)

传输未加密,被第三方篡改或截获

使用 HTTPS / TLS 加密传输


30.3 哈希(Hash)与完整性校验


30.3.1 使用 hashlib

示例:

import hashlib

data = "hello world".encode()

# 生成 SHA256 哈希
h = hashlib.sha256(data).hexdigest()
print(h)

哈希特点:不可逆、固定长度、同输入必同输出。


30.3.2 文件完整性校验

with open("file.zip", "rb") as f:
    file_hash = hashlib.sha256(f.read()).hexdigest()
print("文件哈希:", file_hash)

常用于检查下载文件是否被篡改。


30.4 对称加密(Symmetric Encryption)


30.4.1 使用 cryptography 库

pip install cryptography

示例:

from cryptography.fernet import Fernet

key = Fernet.generate_key()
cipher = Fernet(key)

token = cipher.encrypt(b"my secret data")
print("加密后:", token)

data = cipher.decrypt(token)
print("解密后:", data)

同一密钥用于加密和解密,适合本地数据加密。


30.5 非对称加密(Asymmetric Encryption)


30.5.1 公钥/私钥加密示例

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes

# 生成密钥对
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

message = b"secret"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                 algorithm=hashes.SHA256(), label=None)
)
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                 algorithm=hashes.SHA256(), label=None)
)

print("解密结果:", plaintext)

公钥加密,私钥解密,常用于传输中的密钥交换或身份认证


30.6 安全存储密码(不可逆哈希)


30.6.1 使用 bcrypt

pip install bcrypt

示例:

import bcrypt

password = b"mypassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
print("哈希:", hashed)

# 校验密码
if bcrypt.checkpw(password, hashed):
    print("密码正确")

切勿明文保存用户密码,使用 慢速哈希(bcrypt/scrypt/argon2)提高破解成本。


30.7 安全编程最佳实践


  • 不信任任何用户输入,做严格验证与转义
  • 不在日志中打印敏感信息(token、密码)
  • 定期升级依赖库,修复安全漏洞
  • 使用 HTTPS/TLS 保护传输数据
  • 使用环境变量存放密钥(不要写进代码库)
  • 使用 secrets 模块生成随机安全 Token

secrets 生成 token:

import secrets
token = secrets.token_hex(16)
print(token)

30.8 小结

技术/工具

用途

hashlib

数据完整性校验、不可逆哈希

cryptography.fernet

对称加密,保护本地数据

cryptography.rsa

非对称加密,用于密钥交换和身份认证

bcrypt

安全地存储和验证密码

secrets

生成不可预测的随机密钥/Token

掌握本章内容后,你将能安全地处理敏感数据,避免常见安全漏洞

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言