找回密码
 会员注册
查看: 31|回复: 0

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

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
65944
发表于 2024-9-11 11:21:11 | 显示全部楼层 |阅读模式
1.安装gmssl包pipinstallgmssl1安装完成后,您可以使用gmssl提供的函数来修改User类中的set_password和verify_password方法,以便使用SM2加密和解密密码。以下是使用gmssl的User类示例:importdatetimefromtortoise.modelsimportModelfromtortoiseimportfieldsimportgmssl#User类定义classUser(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加密密码defset_password(self,password:str,public_key):encrypted_password=public_key.encrypt(password.encode())self.passwd=encrypted_password#验证密码defverify_password(self,password:str,private_key):decrypted_password=private_key.decrypt(self.passwd).decode()returndecrypted_password==password#创建User表asyncdefinit_user_table():awaitUser.create_table()#使用示例asyncdefmain():#生成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)awaituser.save()#查询用户users=awaitUser.filter(username='john_doe')foruinusers:print(u.username)#验证密码is_valid=u.verify_password('securepassword',private_key)print(f'Passwordisvalid:{is_valid}')#asyncio.run(main())123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263在实际应用中,私钥(private_key)和公钥(public_key)通常是一次生成并存储起来多次使用的,而不是每次使用时临时生成。私钥必须保密并安全存储,因为它用于解密数据和解密数字签名。公钥则可以公开分发,因为它用于加密数据和验证数字签名。对于密码加密,通常的做法是:在用户注册时,生成一对新的SM2密钥。将私钥安全地存储在服务器上,最好使用密码学安全的随机数生成器来生成私钥。将公钥存储在数据库中,与用户的其它信息一起。使用公钥来加密用户的密码,并将加密后的密码存储在数据库中。在用户登录时,使用存储的私钥来解密加密的密码,以便与用户输入的密码进行比较。这种方法的优点是,即使加密后的密码被泄露,没有私钥,攻击者也无法解密密码。此外,由于每次加密使用的是同一个公钥,所以可以在不改变密码的情况下更新私钥,只需在更新时同时解密和重新加密所有密码即可。在代码中,您需要确保私钥的安全性,不要在客户端或公共代码中暴露私钥。通常,私钥会在服务器的配置文件中或使用环境变量进行管理,并且只有授权的服务器端代码才能访问它。公钥可以安全地公开,因为它不用于解密操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-31 05:56 , Processed in 0.482327 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表