作为一种流行语言,在不同的应用领域,利用Python书写的工具越来越多。Python具有应用领域广泛、简单易学、功能强大等特点,但是在很多场合它也具有一些较难克服的缺点:
- 代码明文,较难加密。
- 由于#1,python脚本很难应用于收费工具领域。
那么如果我想对一个Python工具的使用加以限制,有没有什么方法可以实现呢?本文提供一种简易的License授权机制实现思路,它主要包括如下几部分内容:
- 如何生成一个加密的License文件。
- 如何做License内容核验。
- 如何加密Python代码。
其主要流程逻辑如下:
图1 License授权机制流程
一、引题
我写了一个python脚本eda.py,内容如下。
#!/usr/bin/env python3
def function():
print('I am an EDA tool!')
function()
我在Linux操作系统中执行了这个程序,成功了,输出如下。
[liyanqing@ic001 license]$ ./eda.py
I am an EDA tool!
我决定把这个“牛逼”的脚本分享给别人使用。但是主要的障碍在于,我不希望别人随便传播这个脚本,不希望别人无限期使用这个脚本,不希望别人学会这几行代码的写法,于是我决定对它加上License限制。
二、生成License文件
工具License常在如下方面对工具的使用加以限制:
- 使用的MAC地址。(防止工具被随意拷贝使用)
- 使用期限。(过期失效)
更加复杂的应用场景,还可以对License使用数量、用户列表、工具feature等因素加以限制。
按照这个需求,我们要设计一个简化的License文件,它需要包含以下内容:
- MAC :允许工具启动的机器的MAC地址。
- Date :工具有效期。
- Sign :签名,对以上明文内容的加密,用作内容核验。
首先,我们可以用下面的Linux指令获取机器的MAC地址。
[liyanqing@ic001 license]$ ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.246.128 netmask 255.255.255.0 broadcast 192.168.246.255
inet6 fe80::7e02:97:820d:1bd3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4a:d4:6c txqueuelen 1000 (Ethernet)
RX packets 1491722 bytes 1542769755 (1.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 533500 bytes 32951033 (31.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0