django admin后台中进行多个手机号解密消耗时间对比

需求:

1 手机号在数据库中是使用rsa方式加密存储,后台查看中需要转换为明文,因为需要解密多个手机号,所以在后台查看中消耗时间3秒,希望通过多线程,多进程,异步方式来缩短时间

相关注意点:

Django遵循单请求模型,其中每个请求都在单个线程中处理。在Django的请求 / 响应周期中引入多线程可能无法提供预期的性能提升

据库访问是一个常见的瓶颈,如果数据库连接池不是线程安全的,或者数据库服务器本身无法有效地处理并发连接,则引入多线程可能没有好处。

1:使用异步方式 进行手机号解密--消耗时间1秒

但是,在后台中无法显示手机号

2:使用多线程进行手机号进行解密,消耗时间3秒

3使用多进程来进行手机号解密--直接报错

额,我技术差

4:普通调用对手机号进行解密:消耗3秒

结论:普通调用就好,不用多线程,多进程,异步了


1:使用异步方式 进行手机号解密--消耗时间1秒

但是,在后台中无法显示手机号

python 复制代码
    # -------------------------------------------------------------------------------------
    # 手机号解密
    # 使用异步方式



    async def decrypt_data_async(self, data):
        # 读取私钥文件
        private_key="""-----BEGIN RSA PRIVATE KEY-----
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(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                                                    algorithm=hashes.SHA256(), label=None)).decode('utf-8')
        return decrypted_data


    async def get_shoujihao(self):
        if len(self.shoujihao) >= 20:
            shoujihao1 = self.shoujihao
            shoujihao1 = base64.b64decode(shoujihao1)
            # Split the data into chunks for parallel decryption
            chunk_size = 8000  # Adjust the chunk size based on your data
            chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]
            # Use asyncio.gather to concurrently decrypt chunks
            decrypted_chunks = await asyncio.gather(*(self.decrypt_data_async(chunk) for chunk in chunks))
            # Concatenate the decrypted chunks
            decrypted_data = ''.join(decrypted_chunks)
            color_code = 'green'
            return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)
        else:
            color_code = 'green'
            return format_html('<span style="color:{};">-</span>', color_code, )

    get_shoujihao.short_description = '手机号'

    # -------------------------------------------------------------------------------------

2:使用多线程进行手机号进行解密,消耗时间3秒

python 复制代码
# --------------------------------------------------------------------------------------
# 使用多线程进行解密
from concurrent.futures import ThreadPoolExecutor
# --------------------------------------------------------------------------------------
    # -------------------------------------------------------------------------------------
    # 手机号解密
    # 使用了多线程方式去进行解密
    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-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
            key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
            def decrypt_data(data):
                return key.decrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                                                      algorithm=hashes.SHA256(), label=None)).decode('utf-8')
            # 将数据拆分为块以进行并行解密
            chunk_size = 1000  # 根据数据调整区块大小
            chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]

            # 使用 ThreadPoolExecutor 进行并行解密
            with ThreadPoolExecutor() as executor:
                decrypted_chunks = list(executor.map(decrypt_data, chunks))

            # 连接解密的块
            decrypted_data = ''.join(decrypted_chunks)

            color_code = 'green'
            return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)

        else:
            color_code = 'green'
            return format_html('<span style="color:{};">-</span>', color_code, )

    get_shoujihao.short_description = '手机号'

    # -------------------------------------------------------------------------------------

3使用多进程来进行手机号解密--直接报错,额,我技术差

python 复制代码
# --------------------------------------------------------------------------------------
# 使用多进程进行解密
import logging
from concurrent.futures import ProcessPoolExecutor

logger = logging.getLogger(__name__)
# --------------------------------------------------------------------------------------
    # -------------------------------------------------------------------------------------
    # 手机号解密
    # 使用了多进程方式去进行解密



    def decrypt_data(self, data):
        try:
            # 读取私钥文件
            private_key="""-----BEGIN RSA PRIVATE KEY-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
            key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
            return key.decrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                                              algorithm=hashes.SHA256(), label=None)).decode('utf-8')
        except Exception as e:
            logger.error(f"Error in decryption: {e}")
            raise
    def get_shoujihao(self):
        if len(self.shoujihao) >= 20:
            shoujihao1 = self.shoujihao
            shoujihao1 = base64.b64decode(shoujihao1)

            # 将数据拆分为块以进行并行解密
            chunk_size = 1000  # 根据数据调整区块大小
            chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]

            # 使用 ProcessPoolExecutor 进行并行解密
            with ProcessPoolExecutor(max_workers=2) as executor:
                decrypted_chunks = list(executor.map(self.decrypt_data, chunks))

            # 连接解密的块
            decrypted_data = ''.join(decrypted_chunks)

            color_code = 'green'
            return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)
        else:
            color_code = 'green'
            return format_html('<span style="color:{};">-</span>', color_code, )

    get_shoujihao.short_description = '手机号'

    # -------------------------------------------------------------------------------------

4:普通调用对手机号进行解密:消耗3秒

python 复制代码
    # -------------------------------------------------------------------------------------
    # 手机号解密
    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-----
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 = '手机号'

    # -------------------------------------------------------------------------------------
相关推荐
学编程的小程19 小时前
从“单模冲锋”到“多模共生”——2026 国产时序数据库新物种进化图谱
数据库·时序数据库
卓怡学长19 小时前
m111基于MVC的舞蹈网站的设计与实现
java·前端·数据库·spring boot·spring·mvc
存在的五月雨19 小时前
Redis的一些使用
java·数据库·redis
小冷coding1 天前
【MySQL】MySQL 插入一条数据的完整流程(InnoDB 引擎)
数据库·mysql
鲨莎分不晴1 天前
Redis 基本指令与命令详解
数据库·redis·缓存
专注echarts研发20年1 天前
工业级 Qt 业务窗体标杆实现・ResearchForm 类深度解析
数据库·qt·系统架构
周杰伦的稻香1 天前
MySQL中常见的慢查询与优化
android·数据库·mysql
冉冰学姐1 天前
SSM学生社团管理系统jcjyw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·学生社团管理系统·多角色管理
nvd111 天前
深入分析:Pytest异步测试中的数据库会话事件循环问题
数据库·pytest
appearappear1 天前
如何安全批量更新数据库某个字段
数据库