Python数据加密:保障信息安全的最佳实践

更多资料获取

📚 个人网站:ipengtao.com


随着信息技术的发展,数据安全成为越来越重要的议题。在Python中,有多种方法可以用于数据加密,以确保敏感信息在传输和存储过程中不被泄露或篡改。本文将详细介绍Python中数据加密的最佳实践,包括对称加密、非对称加密、哈希算法等多个方面,并提供丰富的示例代码。

1. 对称加密

对称加密使用同一密钥进行加密和解密,是一种高效的加密方式。下面是使用cryptography库进行对称加密的示例:

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# 加密数据
data = b"Hello, this is a secret message."
cipher_text = cipher_suite.encrypt(data)
print(f"Cipher Text: {cipher_text}")

# 解密数据
plain_text = cipher_suite.decrypt(cipher_text)
print(f"Plain Text: {plain_text.decode()}")

2. 非对称加密

非对称加密使用一对公钥和私钥进行加密和解密,具有更高的安全性。下面是使用cryptography库进行非对称加密的示例:

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding

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

public_key = private_key.public_key()

# 加密数据
data = b"Hello, this is a secret message."
cipher_text = public_key.encrypt(
    data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(f"Cipher Text: {cipher_text}")

# 解密数据
plain_text = private_key.decrypt(
    cipher_text,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(f"Plain Text: {plain_text.decode()}")

3. 哈希算法

哈希算法用于生成数据的固定长度散列值,常用于验证数据完整性。以下是使用Python内置的hashlib库进行哈希的示例:

import hashlib

# 计算字符串的MD5哈希值
data = b"Hello, this is a message."
hash_md5 = hashlib.md5(data).hexdigest()
print(f"MD5 Hash: {hash_md5}")

# 计算字符串的SHA-256哈希值
hash_sha256 = hashlib.sha256(data).hexdigest()
print(f"SHA-256 Hash: {hash_sha256}")

4. 使用PyCryptodome库

PyCryptodome是一个强大的密码学库,支持对称加密、非对称加密、哈希算法等多种功能。以下是一个综合使用PyCryptodome进行数据加密的示例:

from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
import base64

# 对称加密
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
data = b"Hello, this is a secret message."
cipher_text, tag = cipher.encrypt_and_digest(data)
print(f"Symmetric Cipher Text: {base64.b64encode(cipher_text)}")

# 非对称加密
recipient_key = RSA.generate(2048)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
encrypted_data = cipher_rsa.encrypt(data)
print(f"Asymmetric Cipher Text: {base64.b64encode(encrypted_data)}")

# 哈希算法
hash_md5 = hashlib.md5(data).hexdigest()
print(f"MD5 Hash: {hash_md5}")

hash_sha256 = hashlib.sha256(data).hexdigest()
print(f"SHA-256 Hash: {hash_sha256}")

5. 使用PyCryptodome库进行高级加密操作

PyCryptodome库提供了许多高级的加密操作,如文件加解密、数字签名等。以下是一些示例代码:

5.1 文件加解密

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import os

# 生成密钥和初始化向量
key = get_random_bytes(16)
iv = get_random_bytes(16)

# 加密文件
cipher = AES.new(key, AES.MODE_CBC, iv)
with open('plain_text.txt', 'rb') as file:
    plaintext = file.read()
    ciphertext = cipher.encrypt(plaintext)

with open('encrypted_file.bin', 'wb') as file:
    file.write(iv + ciphertext)

# 解密文件
with open('encrypted_file.bin', 'rb') as file:
    data = file.read()
    iv = data[:16]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_data = cipher.decrypt(data[16:])

with open('decrypted_file.txt', 'wb') as file:
    file.write(decrypted_data)

5.2 数字签名

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA

# 生成密钥对
private_key = RSA.generate(2048)
public_key = private_key.publickey()

# 签名
data = b"Hello, this is a message."
hash_value = SHA256.new(data)
signature = pkcs1_15.new(private_key).sign(hash_value)

# 验证签名
hash_value = SHA256.new(data)
try:
    pkcs1_15.new(public_key).verify(hash_value, signature)
    print("Signature is valid.")
except (ValueError, TypeError):
    print("Signature is invalid.")

6. 数据加密与解密的异常处理

在实际应用中,数据加密与解密过程中可能会出现各种异常情况,如密钥错误、数据损坏等。因此,对异常进行合理处理是保证系统稳定性的关键。

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import unpad

def encrypt_and_decrypt():
    try:
        # 生成密钥和初始化向量
        key = get_random_bytes(16)
        iv = get_random_bytes(16)

        # 加密数据
        cipher = AES.new(key, AES.MODE_CBC, iv)
        data = b"Hello, this is a secret message."
        ciphertext = cipher.encrypt(data)

        # 模拟数据传输和接收过程

        # 解密数据
        decrypt_cipher = AES.new(key, AES.MODE_CBC, iv)
        decrypted_data = unpad(decrypt_cipher.decrypt(ciphertext), AES.block_size)

        print(f"Original Data: {data}")
        print(f"Decrypted Data: {decrypted_data.decode()}")

    except Exception as e:
        print(f"Error: {e}")

encrypt_and_decrypt()

数据加密的最佳实践

  • 选择合适的算法和密钥长度: 根据应用场景选择对称加密、非对称加密或哈希算法,并根据安全需求选择适当的密钥长度。

  • 安全存储密钥: 对称加密和非对称加密的密钥都需要安全存储,以防泄露。

  • 适度复杂化密钥: 密钥过于简单容易受到暴力破解攻击,因此密钥的选择应适度复杂化。

  • 及时更新密钥: 定期更新加密密钥,增加系统的安全性。

  • 使用已验证的库和算法: 使用经过验证的密码学库和算法,避免自行实现加密算法。

数据加密的综合实践

综合使用对称加密、非对称加密、哈希算法、文件加解密、数字签名等技术,可以构建更为安全的数据加密方案。在实际应用中,根据具体场景需求,选择适当的加密方式,并充分考虑异常情况,以确保系统的稳定性和数据的安全性。

总结

本文详细介绍了Python中数据加密的最佳实践,包括对称加密、非对称加密、哈希算法等多个方面。通过丰富的示例代码,读者可以更好地理解和应用这些加密技术,以确保数据在处理过程中的安全性。

在实际应用中,根据具体需求选择合适的加密方式,并遵循最佳实践以确保系统的数据安全。希望本文对大家在数据加密方面的学习和应用提供有益的指导。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MA…

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障: 一台emc某型号存储服务器,存储服务器上组建了一组raid5磁盘阵列,阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线,但是只有一块热备盘激活,最终导致该ra…

文件操作入门指南

目录 一、为什么使用文件 二、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四、文件的顺序读写 ​编辑 🌻深入理解 “流”: 🍂文件的顺序读写函数介绍: …

系列十四(面试)、谈谈你对StackOverflowError的理解?

一、StackOverflowError 1.1、概述 StackOverflowError是栈内存溢出的意思。栈中主要存储的是8种基本数据类型 引用类型 实例方法,栈的空间也是有限的,当存储进栈中的容量大于栈的最大容量时,就会报StackOverflowError的错误。 1.2、案例 …

如何入门 GPT 并快速跟上当前的大语言模型 LLM 进展?

入门GPT 首先说第一个问题:如何入门GPT模型? 最直接的方式当然是去阅读官方的论文。GPT模型从2018年的GPT-1到现在的GPT-4已经迭代了好几个版本,通过官方团队发表的论文是最能准确理清其发展脉络的途径,其中包括GPT模型本身和一…

最详细手把手教你安装 Vivado2017.4

软件下载 官网可下载各个版本 百度网盘链接 Vivado2017.4 License 软件安装 解压缩安装包,双击运行安装程序 xsetup.exe: 忽略软件更新,点击 Continue: 点击 Next: 全部勾选 I Agree,点击 Next&#x…

从0到1打造一款WebStyle串口调试工具

Tip:No Ego Some programmers have a huge problem: their own ego. But there is no time for developing an ego. There is no time for being a rockstar. Who is it who decides about your quality as programmer? You? No. The others? Probably. But can …

Python (十二) NumPy操作

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

程序员的20大Git面试问题及答案

文章目录 1.什么是Git?2.Git 工作流程3.在 Git 中提交的命令是什么?4.什么是 Git 中的“裸存储库”?5.Git 是用什么语言编写的?6.在Git中,你如何还原已经 push 并公开的提交?7.git pull 和 git fetch 有什么…

计算机网络(3):数据链路层

数据链路层属于计算机网络的低层。 数据链路层使用的信道主要有以下两种类型: (1)点对点信道。这种信道使用一对一的点对点通信方式。 (2)广播信道。这种信道使用一对多的广播通信方式。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这…

制作PPT找了一个校徽是方形的,如何裁剪为圆形的。

问题描述:制作PPT找了一个校徽是方形的,如何裁剪为圆形的。 问题解决:使用一个在线圆形裁剪软件即可。 网址为: https://crop-circle.imageonline.co/cn/#google_vignette

css实现边框彩虹跑马灯效果

效果展示 代码实战 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

VWAP 订单的最佳执行方法:随机控制法

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

软件设计模式:UML类图

文章目录 前言一、&#x1f4d6;设计模式概述1.软件设计模式的产生背景2.软件设计模式3.设计模式分类 二、&#x1f4e3;UML图1.类图概述2.类的表示法3.类与类之间的关系关联关系&#xff08;1&#xff09;单向关联&#xff08;2&#xff09;双向关联&#xff08;3&#xff09;…

【物联网无线通信技术】WiFi从理论到实践(ESP8266)

文章从理论基础到具体实现完整的介绍了最常见的物联网无线通信技术&#xff1a;WiFi。 文章首先介绍了WiFi这种无线通信技术的一些基本概念&#xff0c;并针对其使用的802.11协议的基本概念与其定义的无线通信连接建立过程进行了简单的介绍&#xff0c;然后对WiFi开发常常涉及的…

代码提交规范-ESLint+Prettier+husky+Commitlint

代码提交规范-ESLintPrettierhuskyCommitlint 配置eslint &#xff08;3步&#xff09;配置prettier(4步)1.安装配置prettier2.设置忽略文件 .prettierignore3.处理eslint冲突4. 配置vscode 的settings.json husky安装并配置lint-staged&#xff08;3步&#xff09;安装配置com…

网线的制作集线器交换机路由器的配置--含思维导图

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 一、网线的制作 1、网线的材料有哪些&#xff1f; 网线 网线是一种用于传输数据信号的电缆&#xff0c;广泛应…

【STM32工具篇】使用CLion开发STM32

本文主要记录使用CLion开发STM32&#xff0c;并调试相关功能 使用的CLion版本&#xff1a;2023.3.1 CLion嵌入式配置教程&#xff1a;STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载&#xff1a;Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

Java 栈和队列的交互实现

文章目录 队列和栈的区别一.用队列模拟实现栈1.1入栈1.2出栈1.3返回栈顶元素1.4判断栈是否为空 二.用栈模拟实现队列2.1 入队2.2出队2.3peek2.4判断队列是否为空 三.完整代码3.1 队列模拟实现栈3.2栈模拟实现队列 队列和栈的区别 栈和队列都是常用的数据结构&#xff0c;它们的…

Zookeeper-快速开始

Zookeeper介绍 简介&#xff1a;ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。 设计目标&#xff1a;将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效…