深度学习类文章回顾
【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】
【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】
【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示
【深度学习】行人跌倒行为检测软件系统
【深度学习】火灾检测软件系统
【深度学习】吸烟行为检测软件系统
【深度学习】数竹签演示软件系统
【深度学习】菜品目标检测软件系统
本文链接:http服务网络请求如何确保数据安全(含python示例源码)
1. 本文摘要
- 当今数据安全越来越重要,http网络请求数据安全加强要求是为了保护公民的隐私和数据安全,防范日益复杂的网络攻击,确保电子商务和在线服务的可靠性,并遵守相关法律法规。
- 当前我参与的各类项目,均有安全检测,例如经常检测出的一些问题
- http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性
- 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。
- 本文主要介绍在http的传输过程中如何保证数据安全,即:如何确保http请求中数据传输的完整性和传输过程中数据的保密性。
- 本文主要使用python flask来演示整个过程。
本系统所涉及的源码已打包上传。
文中源码文件【获取方式】:关注公众号:利哥AI实例探险
给公众号发送 “http传输安全保密” 获取下载方式
注意发送的关键词不能错,否则匹配不到对应资源,由于本人能力有限,难免有疏漏之处。
2. 实际项目中经常遇到的问题
一般情况下,在我们交付完甲方软件系统后,甲方都会请专业的团队进行漏洞检测,出具《xxx系统漏洞检测报告》,这其中我们经常会遇到的问题如下:
- http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性。
- 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。
本文只针对这两类问题,给出一些优化建议。
3. 解决方案
数据的保密性:使用国家密码管理局认可的对称加密算法(如AES)来确保数据的保密性
数据的完整性:可以使用HMAC(哈希消息认证码)来确保数据在传输过程中的完整性
3.1 AES是如何保证数据的保密性的
AES(高级加密标准)对称加密通过以下方式保证数据的保密性:
- 密钥唯一性: AES使用一个唯一的对称密钥,这个密钥必须在发送方和接收方之间保持秘密。如果密钥泄露,任何人都可以解密数据。
- 复杂加密算法: AES算法通过多轮替换和置换操作,将明文数据转换成密文,使得密文难以被破解。
- 初始向量(IV): 在CBC模式中,AES使用一个随机生成的初始向量(IV)进行加密,使相同的明文每次加密得到不同的密文,从而增强了安全性。
- 密钥长度: AES支持128位、192位和256位密钥长度,密钥越长,破解难度越大。
通过以上机制,AES确保了数据在传输过程中的保密性,即使数据被截获,未经授权的一方也无法解密和理解数据。
3.2 随机生成的IV(初始化向量)是如何确保加密的安全性的
- 防止相同明文产生相同密文: 如果使用相同的密钥加密相同的明文,但没有随机IV,那么每次加密的结果将是相同的。这使得攻击者更容易识别和分析重复的模式,从而破坏加密的安全性。随机IV确保即使明文相同,生成的密文也不同。
- 增强密码学强度: IV的随机性增加了加密算法的复杂性,使得攻击者更难以破解。每次加密时生成新的随机IV,确保没有重复,增加了攻击者的工作量。
- 确保初始加密块的随机性: 在使用块加密模式(如CBC模式)时,IV用于加密第一个块。随机IV确保初始块的加密是不可预测的,进一步增强了加密的安全性。
- 防止重放攻击: 在某些情况下,攻击者可能会截获加密的消息并重放它们。使用随机IV确保每个加密会话都是唯一的,从而防止重放攻击。
3.3 哈希消息认证码是如何确保数据传输完整性的
- 哈希函数: HMAC使用一个密码学哈希函数(如SHA-256),将数据和密钥混合生成一个唯一的哈希值。
- 密钥保护: HMAC结合了一个秘密密钥,仅持有该密钥的接收方才能验证数据的完整性,防止中间人篡改数据。
- 签名生成和验证: 发送方在数据传输前计算HMAC并附加到数据上,接收方接收到数据后重新计算HMAC并与传来的HMAC值对比,如果一致,则数据完整无误。
除了使用随机IV确保加密的安全性,还结合了HMAC来确保数据的完整性。每次加密的结果都包含IV和HMAC,接收方使用这些信息验证数据的完整性和解密数据,确保传输过程中的数据既安全又完整。
通过随机IV和HMAC的结合,我们可以实现一个安全的加密传输系统,防止数据被攻击者篡改或重放,确保数据在传输过程中的安全性和完整性。
4. 代码实现示例
- 使用aes加密, AES.new()会自动生成一个随机IV并将其存储在cipher.iv中,SECRET_KEY如果是128位,需要确保是16个字符, 避免引起不必要的异常。这里我们使用的是AES:CBC、BLOCK_SIZE=16、PKCS7填充
import hmac
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
from typing import Tuple
SECRET_KEY = b'synjones2024zhc1'
# 加密函数
def encrypt_data(data: str) -> Tuple[str, str]:
cipher = AES.new(SECRET_KEY, AES.MODE_CBC) #
ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) # BLOCK_SIZE = 16 # 128 bits、默认使用PKCS7填充
iv = base64.b64encode(cipher.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
# 加密后的密文和IV会被编码并传输
return iv, ct
- 使用aes解密
# 解密函数
def decrypt_data(iv: str, ct: str) -> str:
try:
iv = base64.b64decode(iv)
ct = base64.b64decode(ct)
cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) # 使用CBC模式
pt = unpad(cipher.decrypt(ct), AES.block_size) # 使用PKCS7填充
return pt.decode('utf-8')
except (ValueError, KeyError):
return None
3. HMAC生成函数
def generate_hmac(data: str) -> str:
return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()
接下来我们来设计整个流程:
- 加密:使用AES对称加密算法进行数据加密,使用随机生成的IV(初始化向量)确保加密的安全性。
- 解密:解密时使用传递过来的IV和加密数据。
- HMAC:使用HMAC-SHA256算法生成消息认证码,确保数据在传输过程中的完整性。使用HMAC进行验证,如果验证失败则返回错误。
- 数据传输:加密后的数据、IV和HMAC值通过JSON格式进行传输。
from flask import Flask, request, jsonify
import hmac
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
from typing import Tuple
app = Flask(__name__)
# 共享密钥和HMAC密钥
SECRET_KEY = b'synjones2024zhc1' # 16字节,即128位密钥 确保是16个字符, 避免引起不必要的异常
HMAC_KEY = b'synjones2024zhc2' # 16字节,即128位HMAC密钥
'''
AES
CBC、BLOCK_SIZE=16、PKCS7填充
使用Crypto.Util.Padding中的pad和unpad函数进行PKCS7填充和去填充。这里使用块大小BLOCK_SIZE(16字节, 即128位)进行填充。
'''
# 加密函数
def encrypt_data(data: str) -> Tuple[str, str]:
cipher = AES.new(SECRET_KEY, AES.MODE_CBC) # AES.new()会自动生成一个随机IV并将其存储在cipher.iv中
ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) # BLOCK_SIZE = 16 # 128 bits、默认使用PKCS7填充
iv = base64.b64encode(cipher.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
# 加密后的密文和IV会被编码并传输
return iv, ct
# 解密函数
def decrypt_data(iv: str, ct: str) -> str:
try:
iv = base64.b64decode(iv)
ct = base64.b64decode(ct)
cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) # 使用CBC模式
pt = unpad(cipher.decrypt(ct), AES.block_size) # 使用PKCS7填充
return pt.decode('utf-8')
except (ValueError, KeyError):
return None
# HMAC生成函数
def generate_hmac(data: str) -> str:
return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()
@app.route('/send', methods=['POST'])
def send_data():
content = request.json
data_str = json.dumps(content)
print('-----------------send=', data_str)
# 加密数据
iv, encrypted_data = encrypt_data(data_str)
# 生成HMAC
hmac_value = generate_hmac(encrypted_data)
response = {
'iv': iv,
'data': encrypted_data,
'hmac': hmac_value
}
return jsonify(response)
@app.route('/receive', methods=['POST'])
def receive_data():
content = request.json
iv = content.get('iv')
encrypted_data = content.get('data')
received_hmac = content.get('hmac')
# 验证HMAC
expected_hmac = generate_hmac(encrypted_data)
if not hmac.compare_digest(expected_hmac, received_hmac):
return jsonify({'error': 'HMAC verification failed'}), 400
# 解密数据
decrypted_data_str = decrypt_data(iv, encrypted_data)
if decrypted_data_str is None:
return jsonify({'error': 'Decryption failed'}), 400
# 将解密后的字符串反序列化为JSON对象
decrypted_data = json.loads(decrypted_data_str)
return jsonify({'data': decrypted_data})
if __name__ == '__main__':
app.run(debug=True)
我们来使用postman测试:
加密过程:
解密过程
如果您觉得我分享的这些对您有用,请点击原文,关注我吧
原文链接:http服务网络请求如何确保数据安全(含python示例源码),关注获取更多内容!