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.rhkb.cn/news/242265.html

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

相关文章

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习&#xff08;十七&#xff09;虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下&#xff1a; OS WI…

C++入门学习(一)写一个helloworld

1、头文件 #include <iostream> using namespace std; 任何程序都需要这两句的&#xff0c;写上就好。 2、主文件 int main() {cout<<"Hello World!"<<endl;return 0; } 由于是int型数据&#xff0c;所以要返回一个值&#xff0c;即return0。…

Leetcode 2788. 按分隔符拆分字符串

我们可以先自己模拟一下分隔字符串的过程。如果只是简单的&#xff0c;遇到分隔符&#xff0c;将分隔符前后的子串加入结果的List&#xff0c;那么很显然并没有考虑到一个String中有多个字符串的情况。一种比较容易想到的方法是&#xff1a; 先对List中每个字符串遍历&#xf…

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布!不依赖 Linux 内核

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布&#xff01;不依赖 Linux 内核 发布会上&#xff0c;余承东宣布&#xff0c;HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。 申请链接 鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原…

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

IDEA的database使用

一、数据据库 在使用database之前&#xff0c;首先你的电脑要安装好了数据库并且启动。 MySQL卸载手册 链接&#xff1a;https://pan.baidu.com/doc/share/AVXW5SG6T76puBOWnPegmw-602323264797863 提取码&#xff1a;hlgf MySQL安装图解 链接&#xff1a;https://pan.baidu.…

Rust - 可变引用和悬垂引用

可变引用 在上一篇文章中&#xff0c;我们提到了借用的概念&#xff0c;将获取引用作为函数参数称为 借用&#xff08;borrowing&#xff09;&#xff0c;通常情况下&#xff0c;我们无法修改借来的变量&#xff0c;但是可以通过可变引用实现修改借来的变量。代码示例如下&…

OpenHarmony 应用开发入门 (二、应用程序包结构理解及Ability的跳转,与Android的对比)

在进行应用开发前&#xff0c;对程序的目录及包结构的理解是有必要的。如果之前有过android开发经验的&#xff0c;会发现OpenHarmony的应用开发也很简单&#xff0c;有很多概念是相似的。下面对比android分析总结下鸿蒙的应用程序包结构&#xff0c;以及鸿蒙对比android的诸多…

Ubuntu系统pycharm以及annaconda的安装配置笔记以及问题集锦(更新中)

Ubuntu 22.04系统pycharm以及annaconda的安装配置笔记以及问题集锦 pycharm安装 安装完之后桌面上并没有生成图标 后面每次启动pycharm都要到它的安装路径下的bin文件夹下&#xff0c; cd Downloads/pycharm-2018.1.4/bin然后使用sh命令启动脚本程序来打开pycharm sh pycha…

[C#]C# winform部署yolov8目标检测的openvino模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO&#xff08;Open Visual Inference & Neural Network Optimization&#xff09;是由Intel推出的&#xff0c;用于加速深度学习模型推理的工具套件。它旨在提高计算机视觉和深度学…

移动云助力智慧交通数智化升级

智慧交通是在整个交通运输领域充分利用物联网、空间感知、云计算、移动互联网等新一代信息技术&#xff0c;综合运用交通科学、系统方法、人工智能、知识挖掘等理论与工具&#xff0c;以全面感知、深度融合、主动服务、科学决策为目标&#xff0c;推动交通运输更安全、更高效、…

muduo网络库剖析——事件循环EventLoop类

muduo网络库剖析——事件循环EventLoop类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其…

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开…

Mac book air 重新安装系统验证显示 untrusted_cert_title

环境&#xff1a; Mac Book Air macOS Sierra 问题描述&#xff1a; Mac book air 重新安装系统验证显示 untrusted_cert_title 解决方案&#xff1a; 1.终端输入命令行输入 date 会看到一个非常旧的日期 2.更改日期为当前时间 使用以下命令来设置日期和时间&#xff1a…

若依微服务框架,富文本加入图片保存时出现JSON parse error: Unexpected character (‘/‘ (code 47)):...

若依微服务框架&#xff0c;富文本加入图片保存时出现JSON parse error: Unexpected character 一、问题二、解决1.修改网关配置2、对数据进行加密解密2.1安装插件2.2vue页面加密使用2.3后台解密存储 一、问题 若依微服务项目在使用富文本框的时候&#xff0c;富文本加入图片进…

51单片机8*8点阵屏

8*8点阵屏 8*8点阵屏是一种LED显示屏&#xff0c;它由8行和8列的LED灯组成。每个LED灯的开闭状态都可以独立控制&#xff0c;从而可以显示出数字、字母、符号、图形等信息。 8*8点阵屏的原理是通过行列扫描的方式&#xff0c;控制LED灯的亮灭&#xff0c;从而显示出所需的图案或…

[flutter]GIF速度极快问题的两种解决方法

原因&#xff1a; 当GIF图没有设置播放间隔时间时&#xff0c;电脑上会默认间隔0.1s&#xff0c;而flutter默认0s。 解决方法一&#xff1a; 将图片改为webp格式。 解决方法二&#xff1a; 为图片设置帧频率&#xff0c;添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

【ARMv8M Cortex-M33 系列 7.2 -- HardFault 问题定位 1】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 问题背景堆栈对齐要求Cortex-M33 的 FPU 功能 问题背景 rt-thread 在PendSV_Handler退出的时候发生了HardFault_Handler是什么原因&#xff1f;且 LR 的值为0xfffffffd 堆栈对齐要求 在 ARM Cortex-M 架构中…

DNS寻址过程

用一张图详细的描述DNS寻址的过程&#xff0c;是高级前端进阶的网络篇&#xff1a; 主要是第三步要记仔细就行啦&#xff0c;每一步都要详细的记录下来&#xff0c;总结的脉络如下&#xff1a; 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例&#xff1a;优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建&#xff0c;并在…