背景

在一些使用python的商业项目上,开发人员不想被用户看到源代码时,就需要对python代码进行加密;进一步地,如果想限制用户只能在获得授权的机器上运行你写的代码时(利益相关),就需要使用License控制。只有经过加密的代码才能进行License控制,试想一下,如果客户能拿到你的源代码,那么License控制就成为无稽之谈。

这里提供一种代码加密与License控制的思路。

先说python代码加密。

代码加密

众所周知,python是一种开源的编程语言,在开源的语言上做加密,加密效果肯定不如编译性语言的加密效果好,其逆向工程的难度会比编译性语言的逆向工程简单,按照这个思路,既然编译性语言c/c++的逆向工程难,那么为何不先把python编译成c/c++代码,然后再加密呢?根据经验这样是可行的,且这样加密的代码比那些编译成pyd文件或者打包成exe的方法就安全得多(pyd和exe的逆向工程有专门的包可以实现)。这就是这篇文章介绍的加密方法。

思路是先将py转换为c代码,然后编译c为so文件。

准备工作:

linux安装:

  • python-dev

  • gcc

    sudo apt-get install python-dev gcc

python安装第三方库

  • pycrypto(注意:在win10环境下安装这个包可能会报错,解决办法见这里 )

  • Cython

    pip install pycrypto Cython

    加密脚本``setup.py`的代码如下

# coding:utf-8
from distutils.core import setup
from Cython.Build import cythonize
import os'''
该文件的执行需要的在Terminal中输入  python setup.py build_ext --inplace
使用Cpython 编译python文件,关键函数编译成pyd文件(相当于dll)
'''
# 针对多文件情况设置,单文件就只写一个就行, 文件之间用逗号隔开
key_funs = ['test.py']setup(name="XX app", ext_modules = cythonize(key_funs),
)'''
1、将编译后的pyd文件的命名更改成与原py文件一致
2、删除编译后得到的c文件和原py文件
'''
print("——————", os.getcwd(), "——————")files = os.listdir(os.getcwd())
print(files)for fi in files:if fi.__contains__(".pyd"):re_name = fi.split(".")[0] + ".pyd"print(re_name)os.rename(fi, re_name)elif fi.__contains__(".c") or fi in key_funs:os.remove(fi)

为了更好的说明,这里举个简单的例子。

另外准备两个py文件,test.pymain.py,其中test.py是需要加密的代码,main.py是调用加密代码的脚本,不需要加密。

test.py的内容如下

import datetimeclass Today():def get_time(self):print(datetime.datetime.now())def say(self):print('hello world')

main.py的内容如下

from test import Todayt = Today()
t.get_time()
t.say()

加密之前,测试一下运行效果,在终端执行python main.py,输出

2019-08-30 11:38:38.419308
hello world

使用setup.pytest.py进行加密

方法:将需要加密的代码放到列表key_funs里面,然后在终端运行

python setup.py build_ext --inplace

运行完加密脚本setup.py后,会将test.py删掉(请备份到其他地方!),得到test.so文件和文件夹build/,这个文件夹可以删掉。至此代码加密完成。

测试

再次在终端执行python main.py,输出

2019-08-30 11:49:17.986503
hello world

成功!

(注意,不能直接在IDE执行main.py,会出现错误ImportError: cannot import name ‘Today’)

License控制

知道怎么加密代码之后,就可以用license控制你的代码,以防被别人滥用。

通过License可以控制你的代码,控制方式有很多种,包括限制主机、限制时间(过期则无法执行)、限制使用地点等,这里只介绍如何通过License限制主机,其他方法大同小异,做适当修改即可。

物理地址是每台计算机独一无二的身份号码,我们可以利用物理地址作为限制主机的依据。

具体思路是,用户拿到你写的代码后,如果用户的计算机未经你权授则不能运行你的代码,这时候就需要利用物理地址作为权授的载体进行授权计算机。如需要授权计算机,用户要把需权授的机器的物理地址发给你,你使用AES加密算法把这个物理地址加密后,将得到的加密文件发给用户(这个加密文件就相当于一把钥匙,只有拥有这把钥匙才能正常运行你的代码)用户把加密文件放到指定路径下并执行代码,程序读取加密文件并解密,得到你加密的物理地址,将此物理地址与当前主机的物理地址做匹配,如果这两个物理地址相同则程序能正常运行,不同则退出程序。这里将物理地址加密的目的是防止被用户篡改。

这里涉及到的加密算法不做详细介绍,需了解请移步 here

用户计算机申请授权过程

License控制流程图

具体代码及实现例子请移步github

(别忘了点star哦)

Reference:
  • 浅谈常见的七种加密算法及实现
  • 加密Python源代码笔记

【python】python代码加密与License控制相关推荐

  1. python的代码块使用什么控制类、函数以及其他逻辑判断_一篇文章教会你什么是Python模仿强类型...

    前言 Hi,各位小伙伴,你们好,今天我们来说一个Python未来趋势的并且一个好玩的东西. 我们可能多多少少都听过一句话,动态一时爽,重构火葬场.从生产角度出发,Python确实是一门很优秀的语言,但 ...

  2. Python代码加密方案

    Python代码加密方案 方案1:使用Pyarmor工具进行加密 PyArmor 是一个用于加密和保护 Python 脚本的工具.它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 ...

  3. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...

  4. Python代码加密混淆

    python作为一种解释型语言,源代码加密本身比较困难.但有时候我们在发布一款python产品时又必须考虑到代码的加密性,以避免源代码泄露.为此,我查阅了一些资料,研究了几种python代码加密的常见 ...

  5. cython编译python_Cython编译python为so 代码加密示例

    1. 编译出来的so比网上流传的其他方法小很多. 2. language_level  是python的主版本号,如果python版本是2.x,目前的版本Cython需要人工指定language_le ...

  6. 如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)

    Python代码加密方案汇总 文章目录 Python代码加密方案汇总 需求描述 基础:Python文件格式 `.py` python源代码 `.pyc` 编译得到的字节码文件 `.pyo` 编译优化后 ...

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

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

  8. Python代码加密:py文件转pyd文件

    目前使用python语言比较多,尤其是深度学习项目,但是使用python加密比较麻烦,前期接触过几种加密的方案,但是效果都不理想,现在有一种思路比较靠谱:python原文件转pyd,然后用加密狗加密p ...

  9. python代码加密--pyinstaller

    python代码加密需要安装pyinstaller 包 不同系统安装方法 一.windows环境下: 1.安装pyinstaller pip install pyinstaller==3.6.0 2. ...

最新文章

  1. 利用RGB-D数据进行人体检测 带dataset
  2. 深入java并发包源码(三)AQS独占方法源码分析
  3. 巧用lock解决缓存击穿的解决方案
  4. 不加载执行js_前端性能优化:preload 预加载页面资源
  5. Go的内存管理(最新学习)
  6. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  7. 别再 select * 了,送你 12 个查询技巧!
  8. C# 短视频 无水印解析 原视频下载(超详细)
  9. url重写(urlrewrite.xml)
  10. 2020秋招提前批--大疆--机器学习算法工程师--线上笔试题
  11. 优秀的程序员是没有性生活的
  12. 家庭用计算机选购调查报告,【调查报告】计算机选购调查报告.doc
  13. 解决win7卢布符号显示问题
  14. 线段树+KMP-hdu-4125-Moles
  15. 【Python_046】网页爬虫(绕过SSH认证)
  16. NVidia 3060/1650S 独显笔记本 HDMI外接屏幕有输出,笔记本屏幕无输出/ubuntu 更改显卡驱动后无法进入图形界面的处理方法 以及禁止内核自动更新
  17. 互联网公司的几种“死法”
  18. python对电商运营有帮助吗_建议收藏丨电商运营必备,跨境卖家都在用这个狠招!...
  19. 液晶屏有哪些种类,区别是什么?
  20. 招商银行如何关闭大众版和手机银行转账功能

热门文章

  1. 封禁、下架!微信出手了,规范整治数字藏品平台!
  2. Natural Language Comprehension with the EpiReader翻译
  3. 分布式的微服务架构中的核心理念
  4. qqhelp.net 删除 查杀 清除QQ病毒qqhelp变种(6440'qqhelp'net/#sqq5)的方法
  5. Nature | 奇病毒(Mirusviruses)将疱疹病毒与巨型病毒联系起来
  6. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)
  7. PADS Logic中单个器件的PCB封装应该怎么处理呢?
  8. 2020年4月中国编程语言排行榜
  9. c语言和matlab的区别,Matlab与C语言区别.pdf
  10. 数据化解析国内风险投资现状