首页 > Python资料 博客日记
在Python中使用gmssl包实现SM2加密和解密
2024-06-27 18:00:04Python资料围观278次
这篇文章介绍了在Python中使用gmssl包实现SM2加密和解密,分享给大家做个参考,收藏Python资料网收获更多编程知识
1.安装gmssl包
pip install gmssl
安装完成后,您可以使用 gmssl 提供的函数来修改 User 类中的 set_password 和 verify_password 方法,以便使用 SM2 加密和解密密码。以下是使用 gmssl 的 User 类示例:
import datetime
from tortoise.models import Model
from tortoise import fields
import gmssl
# User 类定义
class User(Model):
user_id = fields.IntField(pk=True)
user_no = fields.CharField(max_length=20, unique=True)
username = fields.CharField(max_length=100, unique=True)
# 密码字段,实际存储加密后的密码
passwd = fields.BinaryField()
email = fields.CharField(max_length=100, unique=True)
phone = fields.CharField(max_length=20, unique=True)
created_time = fields.DatetimeField(auto_now_add=True)
modified_time = fields.DatetimeField(auto_now=True)
end_time = fields.DatetimeField()
isactive = fields.BooleanField(default=True)
# 使用 SM2 加密密码
def set_password(self, password: str, public_key):
encrypted_password = public_key.encrypt(password.encode())
self.passwd = encrypted_password
# 验证密码
def verify_password(self, password: str, private_key):
decrypted_password = private_key.decrypt(self.passwd).decode()
return decrypted_password == password
# 创建 User 表
async def init_user_table():
await User.create_table()
# 使用示例
async def main():
# 生成 SM2 密钥对
sm2_crypt = gmssl.sm2.CryptSM2(
public_key=None,
private_key=None
)
private_key, public_key = sm2_crypt.generate_keypair()
# 创建用户
user = User(
user_no='U001',
username='john_doe',
email='john@example.com',
phone='1234567890',
end_time=datetime.datetime.now() + datetime.timedelta(days=365),
)
user.set_password('securepassword', public_key)
await user.save()
# 查询用户
users = await User.filter(username='john_doe')
for u in users:
print(u.username)
# 验证密码
is_valid = u.verify_password('securepassword', private_key)
print(f'Password is valid: {is_valid}')
# asyncio.run(main())
在实际应用中,私钥(private_key)和公钥(public_key)通常是一次生成并存储起来多次使用的,而不是每次使用时临时生成。私钥必须保密并安全存储,因为它用于解密数据和解密数字签名。公钥则可以公开分发,因为它用于加密数据和验证数字签名。
对于密码加密,通常的做法是:
在用户注册时,生成一对新的 SM2 密钥。
将私钥安全地存储在服务器上,最好使用密码学安全的随机数生成器来生成私钥。
将公钥存储在数据库中,与用户的其它信息一起。
使用公钥来加密用户的密码,并将加密后的密码存储在数据库中。
在用户登录时,使用存储的私钥来解密加密的密码,以便与用户输入的密码进行比较。
这种方法的优点是,即使加密后的密码被泄露,没有私钥,攻击者也无法解密密码。此外,由于每次加密使用的是同一个公钥,所以可以在不改变密码的情况下更新私钥,只需在更新时同时解密和重新加密所有密码即可。
在代码中,您需要确保私钥的安全性,不要在客户端或公共代码中暴露私钥。通常,私钥会在服务器的配置文件中或使用环境变量进行管理,并且只有授权的服务器端代码才能访问它。公钥可以安全地公开,因为它不用于解密操作。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 华为OD机试E卷 --boss的收入--24年OD统一考试(Java & JS & Python & C & C++)
- 【js逆向】Python爬虫如何突破字体反爬,拿到想要数据
- 【Python的math库】常用数学函数全解析
- python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据
- 华为OD机试E卷 --分割数组的最大差值--24年OD统一考试(Java & JS & Python & C & C++)
- Python球球大作战
- Python GraphSAGE原理与代码详解,GraphSAGE代码实战,图神经网络,图计算,GraphSAGE代码模版,超简单学习GraphSAGE
- Python酷库之旅-第三方库Pandas(060)
- 【Python】BeautifulSoup:HTML解析
- python、tensorflow、keras的版本对应关系
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程