首页 > 编程语言 >cryptography,是一个强大的 Python 库

cryptography,是一个强大的 Python 库

时间:2024-08-15 20:23:26浏览次数:12  
标签:cryptography Python 强大 key import hashes data public

cryptography 是一个强大的 Python 库,提供了加密、解密、签名、验证等一系列安全功能,帮助开发者轻松实现数据安全。该库适用于各种加密需求,从简单的数据加密到复杂的网络安全通信。

cryptography的功能特性

  • 安全性:提供多种加密算法,确保数据安全。
  • 灵活性:支持多种加密协议和标准。
  • 性能:优化算法,提高加密解密速度。
  • 跨平台:可在多种操作系统上运行。
  • 易用性:简洁的 API 设计,易于学习和使用。

如何安装或者引入 cryptography

使用 pip 命令安装 cryptography 库:

pip install cryptography

在 Python 代码中引入 cryptography 库:

from cryptography.fernet import Fernet

cryptography的基本功能

对称加密

使用 Fernet 算法进行对称加密。

from cryptography.fernet import Fernet

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

# 实例化 Fernet 对象
cipher_suite = Fernet(key)

# 加密数据
data = b"Hello, World!"
encrypted_data = cipher_suite.encrypt(data)

# 解密数据
decrypted_data = cipher_suite.decrypt(encrypted_data)

print(encrypted_data)  # 输出加密后的数据
print(decrypted_data)  # 输出解密后的数据

非对称加密

使用 RSA 算法进行非对称加密。

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

# 生成公钥和私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
public_key = private_key.public_key()

# 加密数据
data = b"Hello, World!"
encrypted_data = public_key.encrypt(
    data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密数据
decrypted_data = private_key.decrypt(
    encrypted_data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(encrypted_data)  # 输出加密后的数据
print(decrypted_data)  # 输出解密后的数据

哈希算法

使用 SHA-256 算法进行哈希计算。

from cryptography.hazmat.primitives import hashes

# 计算哈希值
data = b"Hello, World!"
hasher = hashes.Hash(hashes.SHA256())
hasher.update(data)
hash_value = hasher.finalize()

print(hash_value)  # 输出哈希值

cryptography的高级功能

对称加密

在对称加密中,cryptography 提供了多种算法,如 AES、ChaCha20 等。以下是一个使用 AES 算法进行加密和解密的示例:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding

# 生成密钥和初始化向量
key = b'your-encryption-key-here'
iv = b'your-iv-here'

# 创建加密器实例
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())

# 填充数据以满足加密算法的块大小要求
padder = padding.PKCS7(128).padder()
data = b'your-data-here'
padded_data = padder.update(data) + padder.finalize()

# 加密数据
encryptor = cipher.encryptor()
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()

# 解密数据
decryptor = cipher.decryptor()
unpadded_data = decryptor.update(encrypted_data) + decryptor.finalize()

# 移除填充
unpadder = padding.PKCS7(128).unpadder()
data = unpadder.update(unpadded_data) + unpadder.finalize()

非对称加密

非对称加密算法,如 RSA、ECDSA 等,允许公钥加密和私钥解密,或私钥签名和公钥验证。以下是一个使用 RSA 算法进行加密和解密的示例:

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

# 生成公钥和私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 加密数据
encrypted_data = public_key.encrypt(
    b'your-data-here',
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密数据
decrypted_data = private_key.decrypt(
    encrypted_data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

数字签名

数字签名用于验证消息的完整性和来源。以下是一个使用 ECDSA 算法进行签名的示例:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import padding

# 生成公钥和私钥
private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())
public_key = private_key.public_key()

# 签名数据
signature = private_key.sign(
    b'your-data-here',
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 验证签名
try:
    public_key.verify(
        signature,
        b'your-data-here',
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("The signature is valid.")
except Exception as e:
    print("The signature is invalid.")

会话密钥交换

密钥交换协议,如 Diffie-Hellman,允许双方在不安全的通道上安全地交换密钥。以下是一个使用 X25519 算法进行密钥交换的示例:

from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives import serialization

# 生成公钥和私钥
private_key = x25519.X25519PrivateKey.generate(default_backend())
public_key = private_key.public_key()

# 对方生成公钥和私钥
their_private_key = x25519.X25519PrivateKey.generate(default_backend())
their_public_key = their_private_key.public_key()

# 交换公钥并生成共享密钥
shared_key = private_key.exchange(their_public_key)

# 序列化公钥以便发送
serialized_public_key = public_key.public_bytes(
    encoding=serialization.Encoding.X509,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

密钥派生

密钥派生函数(KDF)用于从密码或共享密钥派生密钥。以下是一个使用 PBKDF2 算法派生密钥的示例:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

# 密码和盐
password = b'your-password-here'
salt = b'your-salt-here'

# 设置 KDF 参数
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
    backend=default_backend()
)

# 派生密钥
derived_key = kdf.derive(password)

消息认证码(MAC)

消息认证码用于验证消息的完整性和来源。以下是一个使用 HMAC 算法生成和验证 MAC 的示例:

from cryptography.hazmat.primitives import hmac

# 密钥和数据
key = b'your-key-here'
data = b'your-data-here'

# 创建 HMAC 对象并生成 MAC
hmac_obj = hmac.HMAC(key, hashes.SHA256(), backend=default_backend())
hmac_obj.update(data)
mac = hmac_obj.finalize()

# 验证 MAC
try:
    hmac_obj = hmac.HMAC(key, hashes.SHA256(), backend=default_backend())
    hmac_obj.update(data)
    hmac_obj.verify(mac)
    print("The MAC is valid.")
except Exception as e:
    print("The MAC is invalid.")

cryptography的实际应用场景

网络通信加密

在网络通信中,确保数据安全传输至关重要。使用cryptography库可以方便地对传输的数据进行加密。

from cryptography.fernet import Fernet

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

# 加密数据
data = b"Hello, this is a secret message."
encrypted_data = cipher_suite.encrypt(data)

# 解密数据
decrypted_data = cipher_suite.decrypt(encrypted_data)
print(decrypted_data)

数据库加密存储

为了保护敏感数据,在数据库中存储加密数据是一种常见的做法。

from cryptography.fernet import Fernet
import sqlite3

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

# 连接数据库
conn = sqlite3.connect('encrypted.db')
cursor = conn.cursor()

# 创建加密表
cursor.execute('CREATE TABLE IF NOT EXISTS secrets (id INTEGER PRIMARY KEY, data BLOB)')

# 加密数据
data = b"Sensitive data"
encrypted_data = cipher_suite.encrypt(data)

# 插入加密数据
cursor.execute('INSERT INTO secrets (data) VALUES (?)', (encrypted_data,))
conn.commit()

# 查询并解密数据
cursor.execute('SELECT data FROM secrets WHERE id = 1')
encrypted_data = cursor.fetchone()[0]
decrypted_data = cipher_suite.decrypt(encrypted_data)
print(decrypted_data)

# 关闭数据库连接
conn.close()

数字签名

数字签名确保数据的完整性和验证数据的发送者。

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

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

# 签名消息
message = b"Sign this message"
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 验证签名
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("The signature is valid.")
except Exception as e:
    print("The signature is invalid.")

HTTPS 连接

使用cryptography库可以创建和验证 SSL/TLS 证书,确保 HTTPS 连接的安全。

from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509.oid import NameOID

# 生成自签名证书
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
subject_name = x509.Name([
    x509.NameOID.COMMON_NAME, 'example.com',
    x509.NameOID.COUNTRY_NAME, 'US',
    x509.NameOID.ORGANIZATION_NAME, 'Example, Inc.',
    x509.NameOID.ORGANIZATIONAL_UNIT_NAME, 'IT',
])

builder = x509.CertificateBuilder().subject_name(
    subject_name
).issuer_name(
    subject_name
).public_key(
    private_key.public_key()
).serial_number(
    x509.random_serial_number()
).validity_period(
    x509.ValidityPeriod(
        start=x509.Date(current_time()),
        end=x509.Date(current_time() + x509 validoity_period(365 * 24 * 60 * 60)),
    )
).add_extension(
    x509.SubjectAlternativeName([
        x509.DNSName('example.com'),
    ]),
    critical=False,
)

# 签名证书
certificate = builder.sign(private_key, hashes.SHA256())

# 输出证书
with open("self_signed_cert.pem", "wb") as f:
    f.write(certificate.public_bytes(serialization.Encoding.PEM))

加密文件存储

加密文件存储可以保护敏感文件不被未经授权的人员访问。

from cryptography.fernet import Fernet

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

# 加密文件
with open('sensitive_file.txt', 'rb') as file:
    original_data = file.read()

encrypted_data = cipher_suite.encrypt(original_data)

with open('sensitive_file.encrypted', 'wb') as file:
    file.write(encrypted_data)

# 解密文件
with open('sensitive_file.encrypted', 'rb') as file:
    encrypted_data = file.read()

decrypted_data = cipher_suite.decrypt(encrypted_data)

with open('sensitive_file.decrypted', 'wb') as file:
    file.write(decrypted_data)

加密货币钱包

使用cryptography库可以创建加密货币钱包,生成和管理私钥和公钥。

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ed25519

# 生成 Ed25519 私钥和公钥
private_key = ed25519.generate_private_key()
public_key = private_key.public_key()

# 签名消息
message = b"Transfer 1 BTC"
signature = private_key.sign(message)

# 验证签名
try:
    public_key.verify(signature, message)
    print("The signature is valid.")
except Exception as e:
    print("The signature is invalid.")

总结

通过本文的介绍,我们深入了解了cryptography库的基本概念、特性以及如何在项目中安装和使用它。掌握了加密、解密、签名、验证等基本功能,同时也学习了更高级的对称加密、非对称加密以及混合加密技术。最后,我们探讨了cryptography在实际应用场景中的广泛应用,为今后的开发工作提供了宝贵的参考。

编程、AI、副业交流:https://t.zsxq.com/19zcqaJ2b
领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

标签:cryptography,Python,强大,key,import,hashes,data,public
From: https://blog.csdn.net/2401_83617404/article/details/141104710

相关文章

  • 盘点一个Python图像读取的小问题
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【Wayne.Wu】问了一个Python图像读取的问题,这里拿出来给大家分享下。一看文字这么多,感觉还是挺复杂的,都有点让人头大的感觉。二、实现过程经过提示,粉丝自己明白了,先进行本地保存,之后再读取,就可以搞定了。顺利地解决......
  • 云计算实训30——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、
    一、mysql主从复制及同步1、mysql主从自动开机同步2、配置mysql5.7版本mysql-5.7.44-linux-glibc2.12-x86_64.tar启动服务、登录对数据库进行基本操作3、使用python操纵mysql数据库4、编辑python脚本自动化操纵mysql数据库二、mycat读写分离......
  • Python实现最长回文字符串
    题目最长回文字符串是一种对称的字符串,如s="ababd",其中"aba"或"bab"都是回文字符串。求解思路最开始的思路是用类似括号匹配的放手,利用栈来做“对对消”,来判断一个字符串是不是回文字符串,但实际操作中发现“对称轴”元素是不确定的,前面的消除会导致后面的无法对比。然后......
  • Python yield和yield from关键字
    在Python中,yield和yieldfrom是两个与生成器(generator)紧密相关的关键字,它们允许函数以迭代的方式逐个返回结果,而不是一次性返回所有结果。这种方式在处理大量数据或需要惰性计算时非常有用,因为它可以节省内存并提高效率。yieldyield关键字用于从函数中返回一个值,并保留函......
  • Python的反射以及应⽤用场景
    Python中的反射(Reflection)是一种强大的机制,它允许程序在运行时(runtime)检查、修改其自身的结构和行为。这种机制通过内置的函数和模块实现,使得程序能够动态地访问对象的属性和方法。在Python中,反射主要通过type()、isinstance()、issubclass()、getattr()、setattr()、hasattr()......
  • Python实现CNN(卷积神经网络)对象检测算法
    目录1.引言2.对象检测的基本原理2.1对象检测的目标2.2常见对象检测方法2.2.1基于滑动窗口的传统方法2.2.2基于区域提议的现代方法2.2.3单阶段检测器2.3本次实现的检测方法3.代码实现3.1环境准备3.2数据准备与预处理3.3构建CNN模型3......
  • [Python学习日记-6] 基本数据类型(上)
    简介    在学习数据类型之前我们要先回答一个问题:为什么计算机要有数据类型呢?计算机不是很NB,很智能吗,为什么会需要人类标注好数据的具体类型呢?这里就要从计算机的角度看一下数据是什么形式的了,举个例子:Jove和1234,这两个数据在我们看来是很清晰的,左边的是字符串,右边......
  • 输入输出-python
    输入输出-python输入输出输入Python提供了input()函数用于从控制台输入数据。name=input("请输入您的姓名:")print("您输入的姓名是:",name)输出Python提供了print()函数用于输出数据到控制台。print("Hello,world!")print()函数可以接受多个参数,并用空格分隔。prin......
  • 变量-python
    变量-python1.变量的定义变量是存储数据的地方,在程序运行时,变量的值可以改变。变量的定义格式如下:变量名=数据例如:a=10b="hello"c=3.142.变量的命名规则变量名可以由字母、数字、下划线组成,但不能以数字开头。3.变量的类型Python中,变量的类型是动态的,不需......
  • python 计算中位数、四分位数、最大值、最小值等
    还是之前的那一堆csv数,主要算每列的中位数、四分位数、最大值、最小值等我在这里做个笔记,方便下次用的时候直接粘过来用#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:vilolinpic.py@time:2024/08/13@desc:"""importpandasaspddf=pd.rea......