Python工程或Flask项目整体加密——so加密

2023-11-08

python代码加密的方法有很多种,可以先进行混淆再加密。我们一般会对Flask项目或python项目的核心代码进行加密,加密方式采用so,编写一个工程加密的工具类,过程如下:

1、安装依赖库

pip3 --default-timeout=1000 install -U cython
sudo apt-get  build-dep  gcc

2、检查工程的所有py文件的当前目录以及所有上级目录下都要有__init__.py文件,若没有则新建

3、在工程根目录下或非工程目录外新建build_so目录并将encrypt_project.py复制到build_so目录下

4、设置工程根目录project_dir地址(encypt_project.py)

# 工程根目录
project_dir = "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project"
# 过滤目录或文件-包含的文件目录下文件不会生成so
exclude_dirs_or_files = [
    "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project/venv",
    "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project/app.py",
    "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project/start_app.sh"]

5、在终端中运行 python3.6 encrypt_project.py build_ext --inplace

完成后,build_so目录下会生成工程所有的so文件和资源文件,检查下Flask服务运行正常。

注意:flask的app.py需要加入exclude_dirs_or_files中,否则服务运行不起来

 

encrypt_project.py代码如下:

# -*- coding:utf-8 -*-
# Author:      zhoushuangfeng
# Date:        2019-12-27
# File:        encrypt_project.py
# Description:
# 1. 安装依赖库
#     pip3 --default-timeout=1000 install -U cython
#     sudo apt-get  build-dep  gcc
# 2. 工程的所有py文件的当前目录以及所有上级目录下都要有__init__.py文件,若没有请新建
# 3. 在工程根目录下或非工程目录外新建build_so目录并将encrypt_project.py复制到build_so目录下
# 4. 设置工程根目录project_dir地址
# 5. 终端中运行 python3.6 encrypt_project.py build_ext --inplace
# 6. build_so目录下会生成工程所有的so文件和资源文件
# 注意:flask的app需要加入exclude_dirs_or_files中,否则服务运行不起来

from distutils.core import setup
from Cython.Build import cythonize
import os
import shutil

# 工程根目录
project_dir = "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project"
# 过滤目录或文件-包含的文件目录下文件不会生成so
exclude_dirs_or_files = [
    "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project/venv",
    "/media/ubuntu/b8f80802-d95a-41c3-b157-6f4e34967425/workspace/zhousf_projects/my_project/app.py"]


def copy_file(project_name, file_dir, root, current_file):
    _, child_dir = root.split(project_name)
    if len(child_dir) > 0:
        target_dir = file_dir + "/" + project_name + child_dir
    else:
        target_dir = file_dir + "/" + project_name
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    shutil.copy(current_file, target_dir)


def distill_dirs_or_files(root):
    for exclude in exclude_dirs_or_files:
        if root.find(exclude) >= 0:
            return True
    return False


def main():
    project_name = os.path.basename(project_dir)
    file_dir = os.getcwd()
    build_dir = file_dir + "/build"
    try:
        for root, dirs, files in os.walk(project_dir):
            for file in files:
                current_file = os.path.join(root, file)
                # 过滤py编译文件
                if file.endswith(".pyc"):
                    continue
                if file.endswith(".c"):
                    continue
                # 过滤当前文件
                if current_file == __file__:
                    continue
                # 过滤build文件夹
                if root.find(build_dir) >= 0:
                    continue
                # 过滤build_so文件夹
                if root.find(file_dir) >= 0:
                    continue
                # 过滤指定目录
                if distill_dirs_or_files(root):
                    continue
                # 过滤指定文件
                if current_file in exclude_dirs_or_files:
                    continue
                # 非py文件进行复制操作
                if not file.endswith(".py"):
                    copy_file(project_name, file_dir, root, current_file)
                    continue
                setup(ext_modules=cythonize([current_file]))
                name, _ = file.split(".")
                # 删除.c文件以保证每次都进行so文件生成
                c_file = os.path.join(root, name + ".c")
                if os.path.exists(c_file):
                    os.remove(c_file)
        if os.path.exists(build_dir):
            shutil.rmtree(build_dir)
        print("done! Generating SO files completed.")
        print("SO dir: " + file_dir)
    except Exception as ex:
        if os.path.exists(build_dir):
            shutil.rmtree(build_dir)
        print("工程的所有py文件的当前目录以及所有上级目录下都要有__init__.py文件,若没有请新建")


main()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python工程或Flask项目整体加密——so加密 的相关文章

随机推荐

  • 魔兽争霸3宽屏显示器适配

    魔兽争霸只提供 4 3 的分辨率选择 800 600 1024 768 等等 如果显示器是 16 9 或 16 10 的话就有点儿蛋疼了 两边都会留出黑边来 可以在 windows 下面双击执行如下的文件来解决这个问题 wide scree
  • Atcoder Beginner Contest 291

    A camel Case AC代码 include
  • 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_Soft-Masked BERT 一种新的中文纠错模型...

    今年 字节AI Lab与复旦大学合作提出了一种中文文本纠错模型 Soft Masked BERT 1 这项工作发表在了ACL 2020上 由于论文并没有开源代码 所以我将对这篇论文进行解读与复现 问题提出 中文文本纠错是一项挑战性的任务 因
  • Python pandas 排序出现'DataFrame' object has no attribute 'sort'错误

    目标 对dataframe一列时间字符串做升序排列 时间字符串格式 2020 03 23 06 20 00 00 00 df sort MTS ascending True 运行提示 AttributeError DataFrame obj
  • CNN训练细节:卷积核分解

    背景 最近看到一些分解卷积层的方法 比如三个3 3的卷积层替代一个7 7的卷积层 或者两个3乘3的卷积层替代一个5 5的卷积层 本文主要是个人粗浅的分析下原因 一 两个3乘3的卷积层替代一个5 5的卷积层 经典原理网图 如图所示 对于两层3
  • 蓝桥杯校内模拟赛题解

    蓝桥杯校内模拟赛题解 引言 本题解非官方满分题解 因此 可能存在下列问题 题意理解错误 导致答案错误 代码中存在一些问题 导致答案错误 算法复杂度的分析有误 导致不能在规定时间内得出结果 由于水平受限 本篇题解全部由 C 语言完成 题解中的
  • 自我管理的重要模型

    文章目录 前言 一 精力管理 自我管理的新旧理念 二 人类精力金字塔 精力管理四个层次 体能 情绪 思维 精神 三 运动 人类为什么喜欢躺平 每天怎么简单高效的完成20分钟的运动量 四 钟摆运动 钟摆运动对工作最大的指导意义 刻意休息 在这
  • Java 到 Go 过渡:基于 Go 开发分布式配置中心的实践

    目录 一 简介 二 Java 实现 三 Go 实现 四 从 Java 过渡到 Go 五 总结 在今天的技术世界中 从一种编程语言转向另一种是很常见的 特别是对于在企业级应用中具有广泛应用的语言如 Java 转向轻量级 效率更高的 Go 语言
  • 【因果学习】贝叶斯网络结构学习方法

    随机对照试验是发现因果关系的黄金准则 然而现实世界中很多问题往往由于道德伦理的原因不允许我们设置干预进行试验 这就引发了在观测数据上学习因果关系的需求 贝叶斯网络是概率论与图论相结合的产物 它用图论的方式直观地表达各变量之间的因果关系 为多
  • 面向对象编程(OOP):理解类、封装性的关键概念

    文章目录 对象 Object 什么是对象 面向对象 OOP 面向过程的编程语言 面向对象的编程语言 类 class 使用类创建对象的流程 类的定义 代码演示 初始化方法和实例属性 类属性和类方法 继承和多态 魔术方法 小结 类的封装性 属性
  • JSR303使用说明文档

    1 引言 参数校验是我们程序开发中必不可少的过程 用户在前端页面上填写表单时 前端js程序会校验参数的合法性 当数据到了后端 为了防止恶意操作 保持程序的健壮性 后端同样需要对数据进行校验 后端参数校验最简单的做法是直接在业务方法里面进行判
  • 大数据单机学习环境搭建(1)Hadoop本地单节点安装

    专题 大数据单机学习环境搭建和使用 1 资源获取 免费下载 2 Hadoop 本地模式 安装及文件配置 2 1安装java 2 2Hadoop安装与配置 2 3设置ssh免密登录 2 4开启hadoop 2 6访问应用 大数据单机学习环境搭
  • mysql 中使用 update 同时更新多个字段

    update 表名 set 字段1 新值1 字段2 新值2 字段3 新值3 where 条件 mysql gt select from tb person id name phone age sex description create t
  • 多机docker部署fisco-bcos区块链

    0 首先每台机器安装docker sudo yum install docker 展示一下机器环境 一共5台机器 111 203 104 97 111 203 104 113 111 203 104 114 111 203 104 116
  • 随想012:断言

    C 标准库提供了名为 assert 的断言宏 C 语言提供了名为 Debug Assert 的断言方法 Java 语言提供名为 assert 的断言关键字 主流编程语言不约而同的在语言层面上提供了 断言 机制 David R Jamson
  • linux-0.12内核之内存管理(1)

    1 内存分页管理机制 内存分页管理是通过页目录表和内存页表所组成的二级表组成的 其中页目录表和页表的结构是一样的 表项结构也相同 页目录表中的每个表项 4B 来寻址一个页表 而每个页表项 4B 来指定一页物理内存页 因此 当指定了一个页目录
  • ansys时间步长怎么设置_ANSYS瞬态动力学分析中的时间步长的选择

    对于瞬态动力学分析问题 如何选取合适的时间步长 才能保证得到正确的计算结果呢 这是我们在瞬态动力学分析中需要关注的一个问题 积分时间步长的选取决定了瞬态动力学问题的求解精度 时间步长越小 则计算精度越高 太大的时间步长会导致高阶模态的响应出
  • centos7下rpm方式安装mysql

    一 CentOS下通过rpm方式安装MySQL CentOS版本 CentOS 7 MySQL版本 MySQL 5 6 22 在网上搜了一下 Linux下安装MYSQL有三种方式 1 通过yum命令在线下载安装 2 下载离线rpm安装包安装
  • Qt应用程序的语言切换

    Qt实现软件界面显示不同的语言 是通过加载字库文件实现的 因此有三个对应的问题需要解决 如何制作字库文件 创建Qt应用程序后 在 pro文件中添加一行代码 TRANSLATIONS qmain zh ts 2 使用QtCreator菜单中的
  • Python工程或Flask项目整体加密——so加密

    python代码加密的方法有很多种 可以先进行混淆再加密 我们一般会对Flask项目或python项目的核心代码进行加密 加密方式采用so 编写一个工程加密的工具类 过程如下 1 安装依赖库 pip3 default timeout 100