文章目录

  • 前言
  • 一、将py文件编译成pyc
  • 二、将py转化成so文件
    • 2.1准备工作
    • 2.2新建py2so.py文件
    • 2.3编译项目文件夹
  • 总结

前言

由于项目的保密性需求,对已开发完成的项目需要进行加密处理,本文给出两种方法。


一、将py文件编译成pyc

加密py代码,虽然编译为pyc作用不大(很容易被反编译出来源码),但还是有一定加密的效果,如果项目比较时间紧,可以用此方法应急处理。

python -m compileall -f -q -b "py文件夹"

该命令会把目录下的py文件都会生成相应的pyc文件
然后执行以下命令,删除掉py文件,只保留pyc文件

 find . -name "*.py" -type f -print -exec rm -rf {} \;

最后执行运行pyc文件就可以了
如:python ****.pyc

注意:此方法加密与使用的python版本要一致,否则会报错。即运行python -m compileall -f -q -b "py文件夹"python ****.pyc的版本要保持一致。


二、将py转化成so文件

2.1准备工作

pip3 install Cythonsudo apt-get update
sudo apt-get install aptitude
sudo aptitude install python3-dev
sudo apt-get install gcc

2.2新建py2so.py文件

填写如下内容:

#-* -coding: UTF-8 -* -"""
执行前提:系统安装python-devel 和 gccPython安装cython
编译某个文件夹:python py2so.py BigoModel
生成结果:目录 build 下
生成完成后:启动文件还需要py/pyc担当,须将启动的py/pyc拷贝到编译目录并删除so文件
"""import sys, os, shutil, time
from distutils.core import setup
from Cython.Build import cythonizestarttime = time.time()
setupfile= os.path.join(os.path.abspath('.'), __file__)def getpy(basepath=os.path.abspath('.'), parentpath='', name='', build_dir="build", excepts=(), copyOther=False, delC=False):"""获取py文件的路径:param basepath: 根路径:param parentpath: 父路径:param name: 文件/夹:param excepts: 排除文件:param copy: 是否copy其他文件:return: py文件的迭代器"""fullpath = os.path.join(basepath, parentpath, name)for fname in os.listdir(fullpath):ffile = os.path.join(fullpath, fname)if os.path.isdir(ffile) and ffile != os.path.join(basepath, build_dir) and not fname.startswith('.'):for f in getpy(basepath, os.path.join(parentpath, name), fname, build_dir, excepts, copyOther, delC):yield felif os.path.isfile(ffile):# print("\t", basepath, parentpath, name, ffile)ext = os.path.splitext(fname)[1]if ext == ".c":if delC and os.stat(ffile).st_mtime > starttime:os.remove(ffile)elif ffile not in excepts and ext not in('.pyc', '.pyx'):# print("\t\t", basepath, parentpath, name, ffile)if ext in('.py', '.pyx') and not fname.startswith('__'):yield os.path.join(parentpath, name, fname)elif copyOther:dstdir = os.path.join(basepath, build_dir, parentpath, name)if not os.path.isdir(dstdir): os.makedirs(dstdir)shutil.copyfile(ffile, os.path.join(dstdir, fname))else:passif __name__ == "__main__":currdir = os.path.abspath('.')parentpath = sys.argv[1] if len(sys.argv)>1 else "."currdir, parentpath = os.path.split(currdir if parentpath == "." else os.path.abspath(parentpath))build_dir = os.path.join(parentpath, "build")build_tmp_dir = os.path.join(build_dir, "temp")print("start:", currdir, parentpath, build_dir)os.chdir(currdir)try:#获取py列表module_list = list(getpy(basepath=currdir,parentpath=parentpath, build_dir=build_dir, excepts=(setupfile)))print(module_list)setup(ext_modules = cythonize(module_list),script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])module_list = list(getpy(basepath=currdir, parentpath=parentpath, build_dir=build_dir, excepts=(setupfile), copyOther=True))except Exception as ex:print("error! ", ex)finally:print("cleaning...")module_list = list(getpy(basepath=currdir, parentpath=parentpath, build_dir=build_dir, excepts=(setupfile), delC=True))if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)print("complate! time:", time.time()-starttime, 's')

2.3编译项目文件夹

python py2so.py project_dir_path

运行结束后,project_dir_path会生成一个build文件夹,将该文件夹下的.os文件全部移动到被加密的文件夹对应的位置,删除原文件夹下的py文件,若为启动文件,建议保留,可通过启动文件来运行程序。


总结

将py文件编译成pyc:

Python 标准库中提供了一个名为 compileall 的库,可以轻松地进行编译。简单方便,提高了一点源码破解门槛
平台兼容性好,py 能在哪里运行,pyc 就能在哪里运行。但是有现成的反编译工具(python-uncompyle6 ),破解成本低。建议在项目时间紧,应急时使用。

将py转化成so文件:

Cython方法加密就是将py文件转为so文件,用so文件替换py文件,执行速率会比python快一些,但是偶尔会遇到部分代码不好使,只能针对进行测试,将失效的不进行加密或者采取其他方式加密。加密效果好,不易被反编译,但是对于项目需要一步步测试。

参考文档:
https://www.jianshu.com/p/166b5dc1e9b9
https://blog.csdn.net/qq_43076825/article/details/108516876
https://github.com/ArvinMei/py2so
如果阅读本文对你有用,欢迎一键三连呀!!!
2022年7月1日09:09:37

实现对python源码加密的方法相关推荐

  1. python源码加密实现

    本文参考如何保护你的 Python 代码对其想法进行实现. 源码地址:spython@github RAYENCRY rayencry使用AES算法对指定目录中的Python源码加密. 内容 背景 安 ...

  2. python程序加密_项目源代码被好朋友“盗用”!让我痛心疾首!给Python源码加密!...

    在加速发展的今天,互联网是一把双刃剑,既可以让软件行业高速发展,也能让它变成到处可见的免费资源.一个软件企业想要高速发展,技术很重要,安全也相当重要,它们同时存在才能保证软件的知识产权不受侵害,实现商 ...

  3. python代码封装加密_对Python源码加密及反编译前后对比

    关于python的加密 目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe进行 保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程. ...

  4. python源码加密打包成pyd,编译生成pyd,加密生成pyd

    关于toollib 当我们交付python代码时,存在源码安全的问题,为了确保源码安全目前最有效的方式就是打包成pyd,为此toollib给力完美的封装. 1)安装toollib 执行命令:pip i ...

  5. Python源码加密与Pytorch模型加密

    0.前言 深度学习领域,常常用python写代码,而且是建立在一些开源框架之上,如pytorch.在实际的项目部署中,也有用conda环境和python代码去部署服务器,在这个时候,又分为两种情况. ...

  6. 【Python基础】加密你的Python源码顺便再打个包如何?

    本篇为专属于"交通科研Lab"志愿者系列推文活动,为大家带来交通高校硕博们原创推文.为作者点赞,欢迎大家关注交流!!! 点击蓝字 关注我们 成为一个智慧.快乐和富有的人. --王宇 ...

  7. 使用JVMTI实现Java源码加密及SpringBoot项目包加密解决方案实践总结

    这里写自定义目录标题) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 1. 为什么要对源码加密 2. 源码加密的方法 3. 为什么选择JVMTI方法 3.1 加密方 ...

  8. html源码加密ensure-china_php源码加密方法详解

    php中文网最新课程 每日17点准时技术干货分享 虽然PHP是世界上最好的语言,但是也有一些因为弱类型语言的安全性问题出现.WordPress历史上就出现过由于PHP本身的缺陷而造成的一些安全性问题, ...

  9. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法

    PHP:使用Zend对源码加密.Zend Guard安装以及Zend Guard Run-time support missing的解决方法 参考文章: (1)PHP:使用Zend对源码加密.Zend ...

最新文章

  1. 如何使用Leangoo看板统计中的任务周期?
  2. IDEA-Java自动生成单元测试
  3. linux 双网卡绑定(bonding)实现负载均衡或故障转移
  4. C# 8 新特性 - using 声明
  5. 2020将至,谈谈中小企业创业的那些事儿
  6. 用VC写Assembly代码(4)
  7. 数据是否服从正态分布
  8. 三菱GXWorks2 多CPU参数设置
  9. 科沃斯扫地机器人无语音提示_科沃斯扫地机器人语音功能,科技or鸡肋?
  10. 【NLP学习笔记】Word Normalization and Stemming
  11. 你好Haskell (1) 环境搭建和简单玩玩
  12. 适配器模式的三种形式
  13. Ardunio开发:esp32—cam摄像头
  14. 不符合正态分布的配对数据也有自己的统计方法。
  15. 用API函数使程序标题栏闪烁
  16. hanlp分词学习笔记
  17. Java和C语言谁能更胜一筹?
  18. AIoT(人工智能+物联网)知识总结+实战项目
  19. AntV G2 饼图
  20. VC6代码移植VS2008的SDK总结,包括OPENGL和DireX还有Cimage 【总结】

热门文章

  1. 网络编程懒人入门(十一):一文读懂什么是IPv6
  2. 利用python中turtle库画小人发射爱心
  3. 扫地机器人能过去地垫_在那台石头扫地机器人用了近一年之后...
  4. win7系统怎么打开日历和便签功能
  5. 比较全的常见的架构设计思想整理
  6. 移动**21*设置无法接通_正常手机号被呼叫时变空号,已停机,无法接通的方法?...
  7. 接口测试常用工具及测试方法(基础篇)
  8. 机器学习分类算法(附图文详解)
  9. Linux 中 dig 命令返回结果解释
  10. 劳动保障职业学院计算机专业,北京劳动保障职业学院2019年各省录取分数线详情...