Python crypto包功能的使用解读
作者:追逐此刻
文章概述了Python中常用的加密库(如cryptography、pycryptodome、hashlib、bcrypt)及其用途,强调选择合适工具的重要性,并指出安全实践如避免MD5/SHA-1、妥善保管密钥等关键注意事项
在Python中,crypto
相关的包通常用于加密、解密、哈希和其他密码学操作。以下是几个常见的与crypto
相关的Python包及其作用:
1. 什么是“加密”?
加密就像把一封信放进一个带锁的盒子里,只有有钥匙的人才能打开看。在计算机里,加密的作用是:
- 保护隐私:比如你的密码、银行卡号不能让别人看到。
- 防止篡改:比如下载的文件不能被坏人偷偷修改。
- 安全通信:比如微信聊天内容不会被黑客偷看。
Python 的 crypto
相关包就是用来做这些事情的!
2. Python 常用的加密包
(1)cryptography(最推荐)
作用:一个超级安全的工具箱,可以做各种加密操作。
能干什么?
- 加密/解密:比如用密码锁住文件,只有知道密码的人能打开。
- 数字签名:比如你写了一份合同,用你的“签名”证明是你写的,别人不能伪造。
- 生成安全密码:比如自动生成一个超级复杂的密码,黑客猜不到。
示例(加密一段文字):
from cryptography.fernet import Fernet # 生成一个钥匙(必须保存好,丢了就打不开了!) key = Fernet.generate_key() # 用钥匙创建一个“锁” cipher = Fernet(key) # 加密一段文字(比如"Hello") encrypted = cipher.encrypt(b"Hello") # 解密 decrypted = cipher.decrypt(encrypted) print(decrypted) # 输出 b"Hello"
(2)pycryptodome(功能强大)
作用:比 cryptography
更底层,支持更多加密算法。
能干什么?
- AES加密(银行级加密,比如支付宝用的就是这种)。
- RSA加密(比如网站用 HTTPS 保护你的密码)。
- 计算文件的哈希值(比如下载软件时检查文件是否被篡改)。
示例(用 AES 加密):
from Crypto.Cipher import AES # 钥匙必须是16字节(比如 b'16-byte-key-12345') key = b'16-byte-key-12345' # 创建一个加密器 cipher = AES.new(key, AES.MODE_EAX) # 加密数据 data = b"Secret Message" ciphertext, tag = cipher.encrypt_and_digest(data) # 解密 cipher = AES.new(key, AES.MODE_EAX, cipher.nonce) decrypted = cipher.decrypt_and_verify(ciphertext, tag) print(decrypted) # 输出 b"Secret Message"
(3)hashlib(Python 自带,计算哈希)
作用:计算“指纹”(哈希值),用来验证数据是否被修改。
能干什么?
- 检查密码:比如你注册时输入的密码会被转换成哈希值存储,下次登录时对比哈希值,而不是直接存密码。
- 验证文件:比如下载一个软件,计算它的哈希值,确保没被病毒修改。
示例(计算 SHA-256 哈希值):
import hashlib # 计算 "Hello" 的哈希值 hash_obj = hashlib.sha256(b"Hello") # 得到哈希值(一串固定长度的字母数字) print(hash_obj.hexdigest()) # 输出:185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
注意:哈希是单向的,不能反向解密(不像前面的加密可以解密)。
(4)bcrypt(专门存密码)
作用:安全存储用户密码,防止黑客破解。
为什么不用普通哈希?
- 普通哈希(如 SHA-256)计算太快,黑客可以暴力.破解。
bcrypt
会故意变慢,让黑客破解更难。
示例(存储和验证密码):
import bcrypt # 1. 用户注册时,哈希密码 password = b"my_password" hashed = bcrypt.hashpw(password, bcrypt.gensalt()) # 加盐(更安全) # 2. 用户登录时,检查密码 input_password = b"my_password" if bcrypt.checkpw(input_password, hashed): print("密码正确!") else: print("密码错误!")
3. 什么时候用哪个包?
你要做什么? | 用哪个包? |
---|---|
加密/解密数据(如文件) | cryptography 或 pycryptodome |
存储用户密码 | bcrypt |
计算哈希值(如校验文件) | hashlib |
网络加密(如 HTTPS) | ssl(Python 自带) |
4. 注意事项(超级重要!)
- 不要自己发明加密算法!用现成的库(如
cryptography
),自己写的很容易被破解。 - 密钥(密码)要保管好!如果别人拿到你的密钥,就能解密你的数据。
- 不要用 MD5/SHA-1!它们已经不安全了,推荐用
SHA-256
或bcrypt
。 - 加密不是万能的!如果电脑有病毒,加密也可能被破解。
5. 总结
- 加密 = 把数据变成乱码,只有有钥匙的人能还原。
- 哈希 = 计算数据的“指纹”,用来验证是否被修改。
- Python 的
crypto
包(如cryptography
、pycryptodome
、hashlib
)就是干这些事的! - 存储密码用
bcrypt
,加密数据用cryptography
,计算哈希用hashlib
。
1. cryptography
作用:一个现代、安全的密码学库,提供高级和低级接口。
功能:
- 对称加密(如AES)
- 非对称加密(如RSA、ECC)
- 哈希(如SHA-256)
- 数字签名
- 密钥生成与管理
示例:
from cryptography.fernet import Fernet key = Fernet.generate_key() cipher = Fernet(key) encrypted = cipher.encrypt(b"Hello, World!") decrypted = cipher.decrypt(encrypted)
2.pycryptodome/pycryptodomex
作用:PyCrypto的替代品,支持广泛的密码学算法。
功能:
- 对称加密(AES、DES、ChaCha20)
- 非对称加密(RSA、DSA)
- 哈希(SHA、MD5)
- 随机数生成
- 数字签名
示例:
from Crypto.Cipher import AES key = b'16-byte-key-12345' cipher = AES.new(key, AES.MODE_EAX) data = b"Secret message" ciphertext, tag = cipher.encrypt_and_digest(data)
3. hashlib(Python标准库)
作用:提供常见的哈希算法(如SHA-1、SHA-256、MD5)。
示例:
import hashlib hash_obj = hashlib.sha256(b"Hello") print(hash_obj.hexdigest())
4. ssl(Python标准库)
作用:用于TLS/SSL加密通信(如HTTPS)。
功能:
- 证书验证
- 安全套接字通信
示例:
import ssl context = ssl.create_default_context()
5.bcrypt
作用:专为密码哈希设计的库(抗暴力.破解)。
示例:
import bcrypt password = b"super-secret" hashed = bcrypt.hashpw(password, bcrypt.gensalt())
6. paramiko(SSH相关)
作用:实现SSH协议,用于加密的远程连接。
功能:
- SSH客户端/服务器
- SFTP文件传输
注意事项
- 安全性:避免使用已弃用的库(如
pycrypto
),优先选择cryptography
或pycryptodome
。 - 哈希算法:MD5和SHA-1已不安全,推荐SHA-256或bcrypt。
- 密钥管理:密钥应通过安全方式(如环境变量)存储,而非硬编码。
总结
- 通用加密:
cryptography
或pycryptodome
。 - 密码哈希:
bcrypt
或argon2
。 - 简单哈希:
hashlib
。 - 网络加密:
ssl
或paramiko
。
根据需求选择合适的工具,并始终遵循最佳安全实践!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。