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 = '手机号'

    # -------------------------------------------------------------------------------------
相关推荐
流星白龙15 分钟前
【MySQL】6.MySQL基本查询(1)
数据库·windows·mysql
夕除17 分钟前
Mysql--11
数据库·mysql
❀͜͡傀儡师29 分钟前
docker部署WhoDB开源轻量级数据库管理工具
数据库·docker·开源
皙然36 分钟前
Redis八大核心数据类型详解:从底层实现到实战落地
数据库·redis·bootstrap
时光追逐者1 小时前
一款免费、简单、高效的在线数据库设计工具
数据库·mysql·oracle·sql server
another heaven1 小时前
【软考 2026 最新版 NoSQL 数据库全分类】
数据库·nosql
满天星83035771 小时前
【MySQL】表的操作
linux·服务器·数据库·mysql
yashuk1 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
F1FJJ1 小时前
VS Code 里管理 PostgreSQL,有哪些选择?主流扩展横向对比
网络·数据库·postgresql·容器
Bdygsl1 小时前
MySQL(8)—— 事务
数据库·mysql