场景: 我写好了一个应用的所有代码,我需要进行分发给我的客户,但是我不想让他们得到源码。请问如何操作?, 有没有全平台统一方案(win/mac/linux)?
已知的分发场景:
1
shinession 348 天前
pyinstaller+1, 环境什么的都集成进去了, 方便快捷
|
2
locoz 348 天前 via Android
前几年的 pycon 我记得有一届里有人介绍了个他的产品,专门做 python 代码打包+混淆/加密的,忘记叫啥了,你可以翻一下
|
3
Etuloser 348 天前
pyinstaller 分别打 win 平台和 linux 平台的包
|
4
fzls 348 天前
用 pyinstaller 就好了
|
5
Lighthughjiajin 348 天前
pyinstaller 能保护源码吗?
|
6
009694 348 天前 via iPhone
核心源码想要保护要么用 c 这类编译成动态库用 python 调,要么服务化。
|
7
myxingkong 348 天前 2
可以使用 Cython 将 Python 源文件 编译成 动态链接库(.pyd|.so),再使用一个入口文件(不需要编译)去调用你的 app 的启动方法。
main.py ```python import sys import my_app sys.exit(my_app.run()) ``` main.py 可以使用 Pyinstaller 单独打包成可执行文件,然后把使用 Cython 编译好的 动态链接库 放到可执行文件的同级目录下,就可以运行了。 |
8
cooljiang 348 天前
程序整体用 pyinstaller 的打包的分发的话会有被反编译的风险(很容易被反编译)
结合楼上说的用 Cython 将 py 编译成动态链接库(.pyd/.so)外,楼主如果想进一步保护 py 分发程序,还可以考虑针对 Python 解释器单独进行加密混淆。 |
9
liuhai233 348 天前
做成 saas 服务 ^-^
|
12
Abbeyok 348 天前
pyarmor
|
13
bthulu 348 天前
编译成 native 就行了
|
14
orcal 348 天前
Nuitka 吧,简单高效全平台
|
16
orcal 348 天前
还是没有 pyinstaller 方便哈哈
|
17
dianso 348 天前
太繁琐,依赖,库
我已经全面转 go 就是看在开发迅速,编译单文件,不依赖 libc ,直接全平台分发 |
18
Alicewish 348 天前
nuitka ,如果有复杂点的库那么打包成功率比 pyinstaller 高。
|
19
mnsw 348 天前
@shinession #1 但这个只能本平台打包本平台的吧?不能跨平台
|
20
lybcyd 348 天前
单靠 pyinstaller 不行,这个反编译很简单的,想要保护源代码肯定还要混淆加密
|
21
JavaGym 348 天前
pywebio 做成网页
|
22
hanyu2pomelo 348 天前
pyarmor 加密后,打包个镜像
|
25
usiantein 347 天前 1
这个主题我有相关实践经验。我们之前做的一个 Python package 也是需要分发到客户的机器上安装,为了保护 python 源代码,我们最后采用的方案是 Cython 编译:将 py 文件编译成 so 二进制,最后 setup.py 打包出来的 wheel 文件中,都是 so 文件。具体可以参考这个 blog: https://art-vasilyev.github.io/posts/protecting-source-code/
|
26
yinlei212 OP 总结下:
Python 没有一个语言级别的代码混淆解决方案,就 Pydantic 而言 是鼓励代码开源的。 总结上面 V 友们的方案: 1. pyinstaller 打包, -- 需要各平台单独打包。有反编译风险。 2. 用 Cython 将 py 编译成 .pyd/.so ->在用 pyinstaller 进行打包 。 -- 各平台单独打包分发、反编风险小 3. pyarmor 是一个专业混淆代码库,也是编译成字节码然后用-> pyinstaller 打包分发 ---- 各平台单独打包分发、反编风最小 4. Nuitka 直接使用 Clang 进行编译运行。 我的结论: 1. 就 安全性而言使用 3 方案 pyarmor 比较好; 2. 就 简单易用性而言 4 方案 Nuitka 是不错的方案。 如以上理解有误请斧正。 |
27
akaHenry 347 天前
@yinlei212 使用 Cython 单独编译一个 .so 的二进制授权+验证库:
1. 可以是填授权码+验证的, 也可以是发 HTTP + 在线检查的. 2. 你的 main() 每次都检查 .so 里的 授权方法, 如果失败, 就不让用. 做到这样, 基本就低成本保护了. 大部分代码, 都没啥保护价值. 只保护最核心的部分+核心链路. |
28
usiantein 347 天前
|
29
usiantein 347 天前
@yinlei212 另外,除了用 Cython 编译每个 .py 源文件外,我们还在整个 package 的入口( i.e., __init__.py )引入了 HTTP 认证,只要用户需要 import 我这个 package ,就需要进行 HTTP 认证,这样当我们不想让客户继续使用这个 package 时,将 HTTP 认证的结果返回为 False 就行了。
|
30
qixinwuchen 347 天前
借楼问下,op 说的 python 应用指的 python 脚本? 还是 python web 项目? 如果想对使用 django 框架开发的 web 项目进行加密,上面的方式能做到吗?
|
31
qixinwuchen 347 天前
@usiantein 请问,假如是复杂的 django web 项目, 能用这种方式加密吗? 对每个 py 文件打包后各个 package 的依赖关系还能保持吗
|
32
usiantein 345 天前
@qixinwuchen 我不太明白你这里所说的「 package 的依赖关系」具体指的是什么,Cython 编译这个技术是针对 Python 语言的,我理解跟什么类型的 web 项目无关。你也可以这么理解,编译后和编译前,源代码的调用方式、启动方式没有任何改变,只是所有的 .py 文件被替换成功能一致的 .so 二进制文件。
|
33
iorilu 344 天前
注意是 python 社区公认, python 就应该开源, 所以核心大佬们从来不愿意研究什么加密, 混淆, 打包二进制之类的事情
目前相对还是 pyinstaller 算成熟的 |