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

news2025/2/26 2:28:58

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

在这里插入图片描述

需求:
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 rsa

import 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:返回c
        if len(self.shoujihao)>=20:
            shoujihao1=self.shoujihao
            shoujihao1 = 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_data
            print("类型")
            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.shoujihao
            if 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.coloradmin.cn/o/1394703.html

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

相关文章

Python基础第一篇(Python概念介绍)

文章目录 一、前言&#xff1a;二、第一个Python程序三&#xff0c;理解Python的解释器四&#xff0c;Python解释器的使用五&#xff0c;Python开发环境 一、前言&#xff1a; 欢迎来到我们的Python学习专栏。在这里&#xff0c;我们将一起探索Python这门强大、灵活、易于学习…

微信小程序+前后端开发学习材料2-(视图+基本内容+表单组件)

学习来源 视图 1.swiper 滑块视图容器。其中只可放置swiper-item组件&#xff0c;否则会导致未定义的行为。 显示面板指示点indicator-dots 基础内容 1.icon 图标组件 实例演示 2.progress 进度条。组件属性的长度单位默认为px&#xff0c;咱用rpx。 实例演示 这…

SVO编译

文章目录 软件版本错误编译运行轨迹路径保存运行TUM数据集 附录针对svo slam的/svo/pose_imu转为tum格式代码 软件版本 ubuntu 20 rosnoeticSVO SLAM虚拟机 windows 11 错误 常见的git clone问题可以使用DevSidecar解决&#xff0c;在 加速服务-基本设置-绑定IP 设置为0.0.0…

Cinder对接NFS文件系统实验详解

2、对接NFS&#xff08;Network File System&#xff1a;网络文件系统&#xff09;实验 实验前的准备&#xff1a; 完整克隆一台虚拟机作为Cinder的后端存储&#xff08;IP为192.168.100.40&#xff09; Cinder节点作为服务端&#xff0c;把Controller作为客户端 Controlle…

git仓库使用说明

Git软件使用 1.先下载git相关软件 下载地址&#xff1a; Git - Downloading Package (git-scm.com) 下载其中一个安装 2.打开gitee网站&#xff0c;注册账号 3.打开个人中心&#xff0c;选择ssh公钥&#xff0c;查看如何生成公钥 4.生成公钥后&#xff0c;添加相应的公钥 …

Docker 安装 PHP

Docker 安装 PHP 安装 PHP 镜像 方法一、docker pull php 查找 Docker Hub 上的 php 镜像: 可以通过 Sort by 查看其他版本的 php&#xff0c;默认是最新版本 php:latest。 此外&#xff0c;我们还可以用 docker search php 命令来查看可用版本&#xff1a; runoobrunoob:…

AI 视频 | HiDream.ai 支持长视频,突破 4 秒限制!

2024 年&#xff0c;AI 视频领域大有可为。那么想卷 AI 视频领域&#xff0c;首先得掌握几个 AI 视频的工具。 之前的文章已经分享了一些常用的 AI 视频工具&#xff0c;比如 Pika、Runway Gen-2、Moonvalley、NeverEnds、DomoAI 以及 Stable Video Diffusion。 这些「往期 A…

关于Access中列的冻结的知识,看这篇就够了

在Microsoft Access中&#xff0c;有一个名为“冻结”的功能&#xff0c;使用户可以在滚动到另一个区域时保持数据表的某个区域可见。 可以使用冻结功能冻结数据表中的表、查询、窗体、视图或存储过程中的一个或多个字段。你冻结的字段将移动到数据表的左侧位置。 如何在Micr…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…

学习python仅此一篇就够了(使用python操作数据库)

python操作mysql SQL语言的分类 数据定义&#xff1a;DDL 数据操作&#xff1a;DML 数据控制&#xff1a;DCL 数据查询&#xff1a;DQL SQL支持注释&#xff1a;单行注释&#xff1a;--&#xff1b;单行注释#&#xff1b;多行注释&#xff1a;/* */ #查看数据库 show da…

Filter过滤器、使用场景、使用办法、创建和配置等

这里写目录标题 过滤器应用场景自动登录统一设置编码格式访问权限控制敏感字符过滤 Filter使用Filter的创建和配置 过滤器 过滤器实际上就是对 web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或 servlet处理通常都是用来拦截request进行处理的&#xff0c;也可以…

再见了RDM,Redis官方GUI才是最好的!

1 简介 直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#xff09;&#xff0c;官方下载地址。 使…

大师学SwiftUI第6章 - 声明式用户界面 Part 4

步进器视图 ​​Stepper​​视图创建一个带递增和递减按钮的控件。该结构体提供了多个初始化方法&#xff0c;包含不同的配置参数组合。以下是最常用的一部分。 Stepper(String, value: Binding, in: Range, step: Float, onEditingChanged: Closure)&#xff1a;此初始化方法…

基于Prism框架的WPF前端框架开发《知产代理数字化解决方案》

最近新开发了一套WPF前端界面框架&#xff0c;叫《知产代理数字化解决方案》&#xff0c;采用了时下流行的Prism框架作为整个系统的基础架构&#xff0c;演示了Prism中的IRegionManager区域管理器、IDialogAware对话框、IDialogService对话框服务、IContainerExtension容器等用…

财务思维一张图

系统研读了《肖星的财务思维课》和得到《贾宁财务思维课》&#xff0c;尝试用一张最简单的图总结财务思维所学到精髓吧。 《肖星的财务思维课》 得到《贾宁财务思维课》 附&#xff1a; 【清华大学】最好的财务课《商业的财务逻辑》&#xff08;全7课&#xff09;肖星教授 【…

Multimodal Multitask Learning with a Unified Transformer

SNLI-VE dataset&#xff0c;natural language understanding tasks&#xff1a;MNLI&#xff0c;QNLI&#xff0c;QQP&#xff0c;SST-2 截止到发文时间的issue数&#xff0c;多吓人呐&#xff0c;不建议复现

猫头虎博主第9期赠书活动:《YOLO目标检测》计算机AI视觉实战YOLO人工智能目标检测与跟踪图像处理深度学习图像检测书籍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

分析Unity崩溃日志(Android)

Unity版本&#xff1a; 这里Unity版本是Unity 2019.4.30f1 崩溃信息&#xff1a; 错误信息如下&#xff1a; Exception Appversion: versionName 1.0.1 versionCode 1 Process: sg.atla.f.c PID: 22716 UID: 10749 Flags: 0x3088be44 Package: sg.atla.f.c v1 (1.0.1) Fo…

.NET架构师:全网最全“权限系统”设计剖析

&#x1f3c6;作者&#xff1a;科技、互联网行业优质创作者 &#x1f3c6;专注领域&#xff1a;.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 &#x1f3c6;欢迎关注我&#xff08;Net数字智慧化基地&#xff09;&#xff0c;里面…

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1&#xff1a;当你使用FormData.from(Flutter3直接不能用)的时候&#xff0c;可能会提示没有这个方法&#xff0c;或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有&#xff0c;这时候可能就是和get库里面的Formdata冲突了 问题1&#xff1a;The me…