在Python中使用gmssl包实现SM2加密和解密

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 密钥。
将私钥安全地存储在服务器上,最好使用密码学安全的随机数生成器来生成私钥。
将公钥存储在数据库中,与用户的其它信息一起。
使用公钥来加密用户的密码,并将加密后的密码存储在数据库中。
在用户登录时,使用存储的私钥来解密加密的密码,以便与用户输入的密码进行比较。
这种方法的优点是,即使加密后的密码被泄露,没有私钥,攻击者也无法解密密码。此外,由于每次加密使用的是同一个公钥,所以可以在不改变密码的情况下更新私钥,只需在更新时同时解密和重新加密所有密码即可。

在代码中,您需要确保私钥的安全性,不要在客户端或公共代码中暴露私钥。通常,私钥会在服务器的配置文件中或使用环境变量进行管理,并且只有授权的服务器端代码才能访问它。公钥可以安全地公开,因为它不用于解密操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试 - 结队编程(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

户外旅行摄影手册,旅游摄影完全攻略

一、资料前言 本套旅游摄影资料,大小295.47M,共有9个文件。 二、资料目录 《川藏线旅游摄影》杨桦.彩印版.pdf 《户外摄影指南》(Essential.Guide.to.Outdoor.photography.amateur)影印版.pdf 《旅行摄影大师班》(英)科尼什.扫描版.PDF 《旅行摄影…

数据结构面试常见问题:数组和链表的区别是什么?

数组 在编程的世界里,数组无疑是最基础的数据结构之一,它像一排整齐的房子,每个房子都有自己的门牌号,我们可以通过这个门牌号直接找到这个房子,无需从头至尾的逐一查找。这个门牌号,就是我们所说的索引&am…

一键下载全自动安装Office全家桶

概述 今天分享一款超级强大的工具软件,该软件实现了一键自动化下载、安装Office全家桶的功能。整套安装流程堪称行云流水,从下载到安装全自动,无需上手操作。只需要安装该工具软件后,点击安装即可。软件会自动识别不同的操作系统架…

Redis中set数据类型详解

SADD key member [member …] summary: Add one or more members to a set since: 1.0.0 SCARD key summary: Get the number of members in a set since: 1.0.0 SDIFF key [key …] summary: Subtract multiple sets since: 1.0.0 SDIFFSTORE destination key [key …] sum…

Oracle——领先的企业级数据库解决方案

一、WHAT IS ORACLWE: ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S 体系结构的数据库之一,ORACLE 通常应用于大型系统的数…

MySQL 5.7的备份恢复到MySQL 8.0

要将MySQL 5.7的备份恢复到MySQL 8.0,您可以按照以下步骤操作: 创建备份: 确保您有一个MySQL 5.7数据库的备份。通常这可以通过使用mysqldump命令来完成。 mysqldump -u root -p --all-databases --single-transaction --quick --lock-tables…

【计算机毕业设计】微信小程序:MHK自学平台的设计与实现——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

MajorDoMo thumb.php 未授权RCE漏洞复现(CNVD-2024-02175)

0x01 产品简介 MajorDoMo是MajorDoMo社区的一个开源DIY智能家居自动化平台。 0x02 漏洞概述 MajorDoMo /modules/thumb/thumb.php接口处存在远程命令执行漏洞,未经身份验证的攻击者可利用此漏洞执行任意指令,获取服务器权限。 0x03 影响范围 MajorD…

tcpdump服务器抓包实测

背景 最近服务器上访问一个接口时候,经常容易conn time out.接口提供者就是不承认是他的问题。IT也说网络没有问题。 TMD有鬼了是吧 然后我就自己百度如何抓包,感谢星火大模型 要在服务器上使用tcpdump抓取当前服务器访问xxxxx:port的包,并分…

Web 常见十大漏洞原理及利用方式

一、PHP命令执行函数 原理: 命令执行函数解释:在PHP中有一些执行命令的函数,这些函数使你可以在PHP基本执行外部执行命令,并获取其输出的结果 漏洞产生原因: (1)没有对用户输入进行过滤或过滤不严 例如,…

【Node.js从基础到高级运用】二十四、Node.js中实现全双工通信

引言 在本篇博客文章中,我们将详细介绍如何在Node.js环境下使用WebSocket来实现全双工通信。WebSocket协议允许在用户的浏览器和服务器之间建立一个持久的连接,通过这个连接可以实现实时、双向的数据传输。 什么是WebSocket? WebSocket是一种…

ARM64架构栈帧回溯

文章目录 前言一、栈帧简介二、demo演示 前言 请参考:ARM64架构栈帧以及帧指针FP 一、栈帧简介 假设下列函数调用: funb() {func() }funa() {funb() }main() {funa() }main函数,funa函数,funb函数都不是叶子函数,其…

MySQL 的事务概念

事务概念 MySQL事务是一个或者多个的数据库操作,要么全部执行成功,要么全部失败回滚。 事务是通过事务日志来实现的,事务日志包括:redo log和undo log。 事务状态 事务有以下五种状态: 活动的部分提交的失败的中止的…

详解爬虫基本知识及入门案列(爬取豆瓣电影《热辣滚烫》的短评 详细讲解代码实现)

目录 前言什么是爬虫? 爬虫与反爬虫基础知识 一、网页基础知识 二、网络传输协议 HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)请求过程的原理? 三、Session和Cookies Session Cookies Session与…

Java:如何轻松获取当前执行的方法名

哈喽,大家好,我是木头左! 在编程的世界里,经常会遇到各种各样的问题。有时候,需要了解当前执行的方法名,以便更好地调试代码或者记录日志。那么,如何在Java中轻松获取当前执行的方法名呢&#x…

【linux备份文件】将文件夹copy到另一位置解决方案

要将文件夹压缩成zip文件&#xff0c;可以使用以下命令&#xff1a; zip -r <压缩文件名.zip> <文件夹路径> 复制代码 其中&#xff0c;<压缩文件名.zip>是你希望生成的zip文件的名称&#xff0c;<文件夹路径>是需要压缩的文件夹的路径。 例如&#xf…

Cesium简单案例

一、Cesium组件 1、HTML <template><div id"cesiumContainer"><!-- 地图工具栏 --><ul class"mapTools"><li v-for"item in toolsData" :key"item.id" click"toolsClick(item)"><!-- 显…

for in 遍历对象,顺序不对

第一次遍历对象会导致时间乱序&#xff0c;如下&#xff1a; var obj { "key1":{"tenantId":""}, "key2":{"tenantId":"1720336885402484738"}, "key16":{"areaId":"1772463994999468…

股权融资成本GLS模型计算

一、模型公式 式中&#xff1a; r 为股权融资成本 P为股价 B为每股净资产 FROE为预测每股净资产收益率 目标&#xff1a;求解股权融资成本r 二、模型口径参考来源 PS&#xff1a;实际以代码为准 ①FROE&#xff08;预测每股净资产收益率&#xff09;: 资本市场开放与…