网络安全&密码学—python中的各种加密算法
字数 953 2025-08-19 12:40:36
Python中的加密算法详解
一、加密基础概念
1. 数据加密定义
数据加密是一种保护数据安全的技术,通过将明文转换为不易被理解的密文,以防止数据泄露、篡改或滥用。加密后的密文可以通过解密过程恢复成原始明文。
2. 密码学分类
密码学主要分为:
- 密码编码学:研究如何设计安全的密码系统
- 密码分析学:研究如何破解密码系统
二、加密方式分类
1. 对称加密
定义:加密和解密使用同一个密钥
特点:
- 加密解密速度快
- 适合加密大量数据
- 密钥需要安全传输和存储
常见算法:
- DES(已不安全)
- 3DES
- AES(目前最广泛使用的对称加密算法)
2. 非对称加密
定义:使用一对密钥(公钥和私钥)
特点:
- 公钥可公开,私钥保密
- 加密解密速度较慢
- 适合加密少量数据和数字签名
常见算法:
- RSA(应用最广泛)
- ECC(椭圆曲线加密,适合移动设备)
- DSA(适用于数字签名)
3. 单向加密(不可逆加密)
定义:通过散列算法生成固定长度的散列值
特点:
- 无法从散列值还原原文
- 常用于数字签名、密码存储等
常见算法:
- MD5(已被破解)
- SHA-1(比MD5安全但速度慢)
- SHA-2(包括SHA-224、SHA-256等)
- HMAC(带密钥的散列消息认证码)
三、Python中的加密实现
1. 编码与解码
# 编码
str_ = "xiaoyu安全"
byte = str_.encode('utf-8') # 转为二进制
# 解码
original = byte.decode('utf-8') # 转回字符串
2. Base64编码
import base64
def enbase64(str_):
return base64.b64encode(str_.encode('utf-8')).decode("utf-8")
def debase64(str_):
return base64.b64decode(str_).decode('utf-8')
# 使用
encoded = enbase64("xiaoyu安全") # 输出: eGlhb3l15a6J5YWo
decoded = debase64(encoded) # 输出: xiaoyu安全
3. MD5加密
import hashlib
def md5(str_):
str_ = str_.encode('utf-8')
result = hashlib.md5(str_)
return result.hexdigest().upper() # 返回大写结果
# 使用
print(md5("hellow_world")) # 输出: 0D0A96FA021CCD3FAC05DF1A584E3185
4. SHA1加密
import hashlib
def sha1(str_):
return hashlib.sha1(str_.encode()).hexdigest()
5. Secrets模块(安全随机数)
import secrets
import string
# 生成安全随机密码
parm = string.ascii_letters + string.digits
password = ''.join(secrets.choice(parm) for i in range(10))
# 生成安全URL
url = 'https://example.com/update=' + secrets.token_urlsafe()
6. DES加密
from pyDes import des, CBC, PAD_PKCS5
import binascii
key = 'xiaoyu13' # 必须8字节
def des_encrypt(s):
secret_key = key
iv = secret_key
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
return binascii.b2a_hex(des_obj.encrypt(s, padmode=PAD_PKCS5))
def des_decrypt(s):
secret_key = key
iv = secret_key
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
return des_obj.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
# 使用
encrypted = des_encrypt('XIAOYU') # 输出: b'ab498fe821d50739'
decrypted = des_decrypt(encrypted) # 输出: b'XIAOYU'
7. AES加密
from Cryptodome.Cipher import AES
from Cryptodome import Random
data = 'XiaoYu安全'
key = b'this is a 16 key' # 必须16/24/32字节
iv = Random.new().read(AES.block_size)
# 加密
mycipher = AES.new(key, AES.MODE_CFB, iv)
cip = mycipher.encrypt(data.encode())
cip_text = iv + cip
# 解密
mydecrypt = AES.new(key, AES.MODE_CFB, cip_text[:16])
decrypted = mydecrypt.decrypt(cip_text[16:]).decode()
8. RSA加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii
# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 加密
message = '你好, RSA!'.encode()
encryptor = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted = encryptor.encrypt(message)
# 解密
decryptor = PKCS1_OAEP.new(RSA.import_key(private_key))
decrypted = decryptor.decrypt(encrypted).decode()
四、实际应用案例
1. 用户登录系统(Flask + MD5)
from flask import Flask
import hashlib
import pymysql
app = Flask(__name__)
@app.route('/login/<username>/<password>/')
def user_login(username, password):
try:
password = hashlib.md5(password.encode()).hexdigest()
sql = 'select * from t_user where username=%s and password=%s'
# 执行SQL验证...
return '登录成功' if valid else '登录失败'
except Exception as e:
return f'登录失败:{str(e)}'
2. 文件完整性验证
import hashlib
def get_file_md5(file_path):
with open(file_path, 'rb') as f:
return hashlib.md5(f.read()).hexdigest()
# 比较文件MD5与预期值
if get_file_md5('file.txt') == 'expected_md5_value':
print("文件完整")
五、安全建议
-
密码存储:
- 使用单向加密(如SHA-256)存储密码
- 加盐(salt)增加安全性
- 密码长度建议10位以上
-
密钥管理:
- 对称加密密钥必须保密
- 非对称加密私钥必须严格保护
- 避免硬编码密钥
-
算法选择:
- 避免使用已被破解的算法(如MD5)
- 根据场景选择合适算法:
- 大量数据:AES
- 密钥交换:RSA
- 数字签名:DSA/ECDSA
-
随机数生成:
- 使用
secrets模块而非random模块生成安全随机数 - 用于密码、令牌等敏感信息生成
- 使用
通过合理选择和组合这些加密技术,可以有效保护数据的机密性、完整性和可用性,防止数据泄露和篡改。