django后台进行加密手机号字段,加密存储,解密显示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

需求:
1 :员工在填写用户的手机号时,直接填写,在django后台中输入
2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符
3:员工在后台中进行查看客户手机号时,需要正常显示,非加密状态
4:直接把公钥和私钥存放到代码里面,不要额外读取存储公钥私钥
5:为何有该需求,请参考《个人信息保护法》

1安装加密插件

pip install rsa

该命令将会安装(2024年1月17日)
1:插件名=pyasn1,版本=pyasn1-0.5.1
2:插件名=rsa,版本=rsa-4.9

2生成加密文件

方法一

请自行创建a.py文件,运行以下代码 python a.py

# 方法一
# pip install rsaimport rsa# 生成公钥和私钥
# 使用rsa插件生成2048位加密
# 公钥 public_key
# 私钥 private_key
(public_key, private_key) = rsa.newkeys(2048)# # # 将公钥和私钥保存到本地文件
# 导出公钥和私钥到文件
with open('public_key.pem', mode='wb') as public_file:public_file.write(public_key.save_pkcs1('PEM'))with open('private_key.pem', mode='wb') as private_file:private_file.write(private_key.save_pkcs1('PEM'))

方法二

安装cryptography生成加密,会比仅用rsa快一点

pip install cryptography
#安装cryptography会自动安装cryptography,cffi,pycparser
from Crypto.PublicKey import RSA  
from Crypto.Cipher import PKCS1_OAEP  
import binascii  # 生成RSA密钥对  
key = RSA.generate(2048)  
public_key = key.publickey()  # 将公钥和私钥保存到本地文件  
with open('public_key.pem', 'wb') as f:  f.write(public_key.export_key())  
with open('private_key.pem', 'wb') as f:  f.write(key.export_key())

这时已经在a.py的相同路径中创建了公钥和私钥的文件

#生成私钥如下
# -----BEGIN RSA PRIVATE KEY-----
# MIIEqQIBAAKCAQEAjItx/es/uoRA8OsH/1S5l6jYX/lTjJVsm3RId169zZTMwkq1
# 8sxFM1v/k1pLeHXokoTa5h6VWFQBgdNV7siGF5Jesrp3cDJQawj32Um31cwBiPGw
# pQlW8q68uz4jbCu9AGFOPQMQrVF3KTNHv8YFJt83Ug5ByxGbpoopA3cZJi1la0LM
# A2QFHgolgGooiIbn8+MP6B8ovk05aKnZJwQvthIp7F+73CEEfC0alLkn5+cPMD+Y
# 5zuCCUwVKZWpQierQIy6Shxu/gQ1zoB0Jnycl2pTR7hJ4hiWxKSz8aPzv5h4+ZGh
# 2Ou3FdaFTnL85fLbrSsugqS8bGV6teR4QPoVqwIDAQABAoIBAGD4baRGxmfIjI4t
# fA0dxhfv9aryekULbC4uIznJcqf/vO9pYPSvICf5l/NxX5UztU4ywF36SAzzmT6c
# NDRWwr5MzW3/3hzZekb/nxKbHG41HfIA4GJeeVFkYu/GReaCnxs+CB9sl/sdtFwG
# 98BHvpI9fQvurlKQSRYIXaoeiWYzsBKxBq4rCgpcgd3wYqhu9QrlhLbUDfF0Vr97
# UK6sqckJ01rV1UFSNK5UpBGRNQ/UrLKYjxxIYnDqjTf7UofOzuaeLfTMHy5+o4mB
# Pkh911h/pC/cCePlhcvz07GGyslntscoi/HCK5TLdaFBkeyVttN9Agxxl3siG6ux
# 1rQ2r1ECgYkAun5oomGfEo9Tmxr6TlDqwg3aeD62vgVxjJ5DRHJ832nsfA+VI9uQ
# iD951AntPURLQdAFIr2W6146KyIBPGo/kS/cT29gbutDI9ws90AT7KySBs2E2jjH
# 8hUxrXSdxVZTEdWFpkRUSj9i+N49uoT4HLHncgWJ1BkXYibTG5QcLyaYq39AL2GO
# ZwJ5AMDs+y5OSf4hgUNUYGl3J2X3RG8lpPG/kHKn6onekWni7WIEr6bD8fAPaptv
# 5XkYYsWxB9iG7MupCnzTX4IONy9ALs0UoY9STkPWV4l9qoOMatH9rW1jyRQD28Tp
# qNuAGlYBPQFaqv7I5QhJ6Wqe94tGMWfX+2rsHQKBiQCz1/NPpJSicVVO3lVD8QRy
# 3qkwDEpuNRGraXO1LjL9wEgt21kXm0VmHtB9ipUd4B4y+Uf6mJpRoCy4K7LFcDCc
# 8mqir+VvEbFNg6ZZSZHtSv4HUWosh1VKPuYJP8xl4Tl6mU6paHtgnn/zP16H4HLk
# OSvY6T5hK1FBde9fSRVk4vOXbr+W8Z1BAnhgzwoD5HkwsrNgi9iNU6NLgVavx14L
# iSr8vdHtOOgTEDI6O0vBDRY8dh/yu6WUrG3z8a+UMbBlSf/fP1nvsx5x8W0Kr82a
# U5y+YbIvZgXIWQ/JK9h4yde+2WjQWMfIzXFpstlf8pVXoIt9K0mbnQVut9xW1YRt
# 1OkCgYgkkw7Tlf0ASZ5mkpy07MplV6h2umoP2IgDtZWzVJBqI1fbvKuqHgCr/0w+
# wlWF/fOGnKdjIO1EWUJ6RRYC10V57iSHUhncv0X0OxlbedFtuo0UX0FfpYbJNkzU
# PhQ4uT1geCltZZwRMAMSKERUErCRKkwuxOIUx9bZ4NsXABhDzegcNh66nimE
# -----END RSA PRIVATE KEY-----# 生成公钥如下
# -----BEGIN RSA PUBLIC KEY-----
# MIIBCgKCAQEAjItx/es/uoRA8OsH/1S5l6jYX/lTjJVsm3RId169zZTMwkq18sxF
# M1v/k1pLeHXokoTa5h6VWFQBgdNV7siGF5Jesrp3cDJQawj32Um31cwBiPGwpQlW
# 8q68uz4jbCu9AGFOPQMQrVF3KTNHv8YFJt83Ug5ByxGbpoopA3cZJi1la0LMA2QF
# HgolgGooiIbn8+MP6B8ovk05aKnZJwQvthIp7F+73CEEfC0alLkn5+cPMD+Y5zuC
# CUwVKZWpQierQIy6Shxu/gQ1zoB0Jnycl2pTR7hJ4hiWxKSz8aPzv5h4+ZGh2Ou3
# FdaFTnL85fLbrSsugqS8bGV6teR4QPoVqwIDAQAB
# -----END RSA PUBLIC KEY-----

3安装读取加密插件

pip install cryptography

4:在django项目中应用

models.py文件中代码如下

# -------------------------------------------------------------------------------------
# 手机号加密插件
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
import base64# -------------------------------------------------------------------------------------
class Order(models.Model):id = models.BigAutoField(primary_key=True, unique=True, verbose_name='订单id', )shoujihao = models.TextField(verbose_name='客户手机号码', max_length=30000, blank=True)# -------------------------------------------------------------------------------------# 手机号解密def get_shoujihao(self):# 1:获取到数据库中的字符串 a# 2:把字符串转换成字节类型 b# 3:对字节b进行解密为 c# 4:返回cif len(self.shoujihao)>=20:shoujihao1=self.shoujihaoshoujihao1 = base64.b64decode(shoujihao1)# 读取私钥文件private_key="""-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAp4vQEgBPcCy09xmJDVFxjuYk+USqBNgUxIHF4+E9Vot1rDWU
ncFSIERsEqTq9wIlVsgiVtRJ/0FxHLIgZPlFvRRUh0JjxkpddYAK+EKK2gySoiE8
kUwomeYpILg/pAxtSoRBbUqtE/sTQZM2sOM07FYrz/Q8oVBN1Au3/LwOOAFf6R/5
lFBJCutS/wAuvydwxlTjuNp4PF4Tc65qaF+35VE0IvcOByahAPRqI4TqFb/UOidJ
1Xc4HPIwmtkeYYRyqDgZun2tdQ0iQm7A7lN9TkP6qoKbTRI9ySoBHs4SJXy8r63r
xPRgkjEsVR/hcsZAt7LHjNnZKWd8b1yi0AO56QIDAQABAoIBABya/xUXtvheta3r
ju32bgY5Dm59le6aSt9rDbOUuPF+AYL7qepOP5yROgdr3075b5ETveMnvxOE45BD
7Ep5EbpQzobCY8EO4MqHKDhPOiA03dMvDAV9pH/0Hyj+NCVo1r8OehI0Gf1LlHPR
c9i7DgXcx4GrgC+Fg6g0sP7GR8IxWKkT1rHNWWjqaWh3HlBbJhdrZpxjKbCqTjKM
ImrgPKDi1An0NNHJyQe42XNgmOAMoCRUvP8skLveyYDQ2+LCeTjnmOD0WTMlwlt3
ulu4MjKh/wMAj7dxguonK97C01n0utP+k0KdkOP+rBNazEF2roY2FrcYr+n1MgTs
QDECG1JVtYVP1Tuyb3pgoQKBgC9SV/Ft1K4T8e/AiTrF07SCn8BEZOZ0BDI69+lB
cYh1CPXBt1M0a+T+M1mwCVWxYrapfVismesnIiVQO+n2AehdDyvE1krkHRTQCUYD
PkM7efPek9WBWHy6dbEPJ+mMDs1P5mVOV7MJEGQMtE01BO/KoQ74fePrbaFDwHkU
nzuBAoGBAJIpUUmDMnkMzr5HPw1rtZEjkR0k+EQXU3jeaKA1TjqRoli1ApUpBB11
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())decrypted_data = key.decrypt(shoujihao1, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(), label=None))# decrypted_data 的类型为字节decrypted_data=decrypted_data.decode('utf-8')# decrypted_data.decode()之后的类型为字符串shoujihao1=decrypted_dataprint("类型")print(type(decrypted_data))print(decrypted_data)# 打印解密后的消息color_code = 'green'return format_html('<span style="color:{};">{}</span>', color_code, shoujihao1)else:color_code = 'green'return format_html('<span style="color:{};">-</span>', color_code, )get_shoujihao.short_description = '手机号'

admin.py文件中代码如下


# -------------------------------------------------------------------------------------
# 手机号加密插件
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
import base64# -------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------
class Order_salesmanAdmin(admin.ModelAdmin):# -------------------------------------------------------------------------------------# 手机号加密显示 和手机号显示# 设置录入后台中展示的数据字段list_display = ['id','shoujihao', 'get_shoujihao',]def save_model(self, request, obj, form, change):if not obj.pk:obj.userid = UserProfile.objects.get(user=request.user)# 客户手机号加密存储shoujihao1 = obj.shoujihaoif len(shoujihao1) == 11:# 1:在admin后台中,允许用户输入的是字符串类型的数据# 2:加密之后得到的是字节类型,# 3:把字节类型的编码为utf-8的字符串类型 存储在数据库中# 读取公钥文件public_key = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4vQEgBPcCy09xmJDVFx
juYk+USqBNgUxIHF4+E9Vot1rDWUncFSIERsEqTq9wIlVsgiVtRJ/0FxHLIgZPlF
TkP6qoKbTRI9ySoBHs4SJXy8r63rxPRgkjEsVR/hcsZAt7LHjNnZKWd8b1yi0AO5
6QIDAQAB
-----END PUBLIC KEY-----"""key = serialization.load_pem_public_key(public_key.encode(), backend=default_backend())encrypted_data = key.encrypt(shoujihao1.encode(),padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(), label=None))# 加密后的数据类型 encrypted_data <class 'bytes'> 字节类型encrypted_data=base64.b64encode(encrypted_data).decode('utf-8')# decode为utf-8之后的数据类型  为字符串类型,这样才可以在字符字段中存储# print("decode之后的数据类型")# print(type(encrypted_data))# print(encrypted_data)obj.shoujihao =encrypted_data# -------------------------------------------------------------------------------------if not change:obj.userid = UserProfile.objects.get(user=request.user)else:obj.updated_userid = UserProfile.objects.get(user=request.user)obj.save()super().save_model(request, obj, form, change)# -------------------------------------------------------------------------------------

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

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

相关文章

文心一言使用分享

ChatGPT 和文心一言哪个更好用&#xff1f; 一个直接可以用&#xff0c;一个还需要借助一些工具&#xff0c;还有可能账号会消失…… 没有可比性。 通用大模型用于特定功能的时候需要一些引导技巧。 import math import time def calculate_coordinate(c, d, e, f, g, h,…

Jenkins的环境部署,(打包、发布、部署、自动化测试)

一、Tomcat环境安装 1.安装JDK&#xff08;Java环境&#xff09; JDK下载地址&#xff1a;Java Downloads | Oracle 安装好后在系统环境变量里配置环境变量&#xff1a; ①添加JAVA_HOME 变量名&#xff1a;JAVA_HOME变量值&#xff1a;C:\Program Files\Java\jdk1.8.0_18…

Docker安全基线检查需要修复的一些问题

一、可能出现的漏洞 限制容器之间的网络流量 限制容器的内存使用量 为Docker启用内容信任 将容器的根文件系统挂载为只读 审核Docker文件和目录 默认情况下&#xff0c;同一主机上的容器之间允许所有网络通信。 如果不需要&#xff0c;请限制所有容器间的通信。 将需要相互通…

精品基于Uniapp+springboot农产品安全领域的信息采集系统App

《[含文档PPT源码等]精品基于Uniappspringboot农产品安全领域的信息采集系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;sprin…

openEuler 下部署Zabbix报表系统zbxtable

1.zbxtable简单介绍 官网地址:使用文档 | ZbxTable ZbxTable 是使用 Go 语言开发的一个开源的 Zabbix 报表系统 目前已经推出 ZbxTable 2.1 版本 主要功能如下&#xff1a; 按照主机类型&#xff0c;展示或导出主机资源 资产管理&#xff0c;资源状态总览 多用户、角色、…

三、MySQL实例初始化、设置、服务启动关闭、环境变量配置、客户端登入(一篇足以从白走到黑)

目录 1、选择安装的电脑类型、设置端口号 2、选择mysql账号密码加密规则 3、设置root账户密码 4、设置mysql服务名和服务启动策略 5、执行设置&#xff08;初始化mysql实例&#xff09; 6、完成设置 7、MySQL数据库服务的启动和停止 方式一&#xff1a;图形化方式 方式…

Python 一行命令部署http、ftp服务

Python 一行命令部署http服务 文章目录 Python 一行命令部署http服务具体操作命令如下浏览器返回下载Python 一行命令部署FTP服务 具体操作命令如下 这个比nginx相对来说更加简单&#xff0c;可以用于部署特殊场景时如银行等部署时&#xff0c;各种权限控制&#xff0c;内网之间…

课表排课小程序怎么制作?多少钱?

在当今的数字化时代&#xff0c;无论是购物、支付、点餐&#xff0c;还是工作、学习&#xff0c;都离不开各种各样的微信小程序。其中&#xff0c;课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢&#xff1f;又需要多少钱呢&#xff1f; …

java代码实现CAS

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

适合进阶学习的 机器学习 开源项目(可快速下载)

目录 开源项目合集[>> 开源的机器学习平台&#xff1a;mlflow/mlflow](https://gitcode.com/mlflow/mlflow)[>> 机器学习路线图&#xff1a;mrdbourke/machine-learning-roadmap](https://gitcode.com/mrdbourke/machine-learning-roadmap)[>> 机器学习理论和…

【React源码 - Diff算法】

介绍 在React学习中&#xff0c;Diff算法(协调算法)&#xff0c;想必我们并不陌生&#xff0c;简单来说就是一个对比新老节点寻找差异&#xff0c;然后找出最小的一个变化集&#xff0c;最后对这个最小变化集进行最小的DOM操作&#xff0c;本文将从源码来分析在React(17.0.2)中…

python中Pytest常用的插件

前言 除了框架本身提供的功能外&#xff0c;Pytest还支持上百种第三方插件&#xff0c;良好的扩展性可以更好的满足大家在用例设计时的不同需求。本文将为大家详细介绍下面5项常用的插件。 1. 用例依赖 编写用例的时候&#xff0c;我们会注意用例之间的独立性&#xff0c;但部分…