完成软件开发后,将软件给到用户使用,但是你只希望给固定的用户或固定的电脑使用,这时license就上场了,本文介绍license的生成与调用。

一、前言

MAC地址是计算机的物理地址,它一般由网卡设备决定,用来表示互联网上不同的站点相关的标识符,而且每一台计算机都拥有不同的物理地址。MAC地址由计算机的网卡决定,而且它是固定的,一般不会被更改。因此将电脑的mac地址是作为电脑的标识。

获取mac地址后,通过一套加密算法将地址生成license,并给出license失效时间。然后每次运行软件前,需读取license进行解密,并与当前电脑的mac地址对比。如果相等,则授权成功,成功运行软件;否则授权失败。

二、实现方式

使用hash算法对mac地址加密,hash算法的特点是正向快速、逆向困难、输入敏感、冲突避免

2.1 加密过程

# 首先获取license字典,包含mac地址,license失效时间,和mac加密结果
psw = Utils().hash_msg('jerry' + str(self.mac_addr))  # 将mac地址加个字符串进行编译,增加破解难度,字符串自定义license = {}
license['mac'] = self.mac_addr
license['license_time'] = self.license_time
license['psw'] = psw
print('license:', license)
# license: {'mac': 'f0:2f:74:f3:9e:9e', 'license_time': '2022-09-11T10:03:15.447229', 'psw': '1860d86e80d9d1a80c330e0b22e66def40aa22c79d3bc4412b7537eb7c6c8fe5'}
# 上述license还是很容易看出的,需要进一步加密。
from utils import PrpCrypt, Utils
pc = PrpCrypt('keyskeyskeyskeys')  # 初始化密钥,可以为16位,32位,以及更长,一般为16位,加密解密都需要这个,字符串自定义
encrypted_license = pc.encrypt(str(license))  # 加密 <class 'bytes'>
encrypted_license = str(encrypted_license, encoding = "utf-8")   #  bytes to str
print(encrypted_license)
# encrypted_license = ba00b17adf2f10d8274b9a59ec71287cb633acd1b69905875602dd0bc4c1903c6926a3272e199fb65eaaafdfb85eae4c3d0d4063abaf4792a603f0eb38691fce3a436071c694d64b2825a385e3c81a70dd9af5eebebdbfa975ff5d97a5a03ffa1b46d41b91f857e11b894faf9c0cbe180e956c8e163964a14eeacf17fb8436f8719021dfe3dfcaf81c0f1fd029ef509c0dc3b3031da38d84e7a2e20fd742fb6d
# 将生成的encrypted_license写入特定文件中,完成license生成。
def write_license(self, file_path, s_encrypt):with open(file_path, 'w', encoding='utf-8') as lic:lic.write(str(s_encrypt))lic.close()Utils().write_license(file_path, str(encrypted_license))

2.2 解密过程

# 解密过程需要用到两个字符串,分别是加密过程中,mac地址前加的jerry和初始化密钥keyskeyskeyskeys
def lic_decrypt(self, lic_path):encrpted_content = Utils().get_license_lic(lic_path)pc = PrpCrypt('keyskeyskeyskeys')d = pc.decrypt(encrpted_content)lic = ast.literal_eval(d)# print(lic)return lic
# 然后将生成的license与已有的mac地址,或者加密的mac地址进行对比即可

2.3 一些工具类函数

# 获取mac地址,win和linux通用
def get_mac_address(self):mac = uuid.UUID(int = uuid.getnode()).hex[-12:]return ":".join([mac[e:e+2] for e in range(0,11,2)])# 进行hash计算加密
def hash_msg(self, msg):sha256 = hashlib.sha256()sha256.update(msg.encode('utf-8'))res = sha256.hexdigest()return res

三、程序打包

此时,即可将你生成的license许可放到你的python脚本中,从你的主函数中进行调用。python打包教程可以参照笔者博客,传送门。

四、 小结

  1. 首先,代码使用aes对称加密,密钥是保存在客户端的,包括生成的hash值也是存在客户端,这是危险的。如果客户端被逆向,可能会反推出加密算法。使用rsa做授权码生成比较安全,公钥加密,私钥解密,至少可以保证授权码很难被逆推出来。
  2. 授权过期时间读取本地系统时间,使用授权截止日期减去当前日期。如果黑客在自己电脑上修改系统时间,将会非常容易绕过授权验证。可以改成远端获取实际时间的方式,起码可以避免修改系统时间导致的绕过问题
  3. 本文提供了一种加密的思路,当然也可以将任何可以从电脑传出来的唯一参数作为加密的参数都可以。
  4. 如果大家需要源代码进行调试或有更好的思路,欢迎留言。

本文在原有技术上进行修改,尊重原创,放原文博客链接

python软件许可License文件生成相关推荐

  1. 「Python」python调用单个C++文件生成的动态库(.so)Part I

    环境说明 系统:Ubuntu 18.04 python:python 2.7.17 额外环境 上面的环境是普通测试,但是最终标题中的任务我需要在docker中执行,很多块内容我也不太懂,所以一步一步测 ...

  2. license文件生成原理

    byte解密weblogic加密oraclehex 现在很多J2EE应用都采用一个license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的license文件对系统进行限制,比如试用版 ...

  3. python脚本将json文件生成C语言结构体

    1.引言 以前用过python脚本根据excel生成相关C语言代码,其实本质就是文件的读写,主要是逻辑问题,这次尝试将json文件生成C语言的结构体. 2.代码 这是一个json文件,生成这个结构体的 ...

  4. Vehicle Spy 3软件添加license文件

    1.Vehicle Spy 3软件使用时需要添加license,否则功能会受限,有些功能会无法使用 2. 打开"Tools-->Options"选项 3.在弹出的" ...

  5. 使用python读取txt坐标文件生成挖空矿山_探矿批量

    # -*-coding:utf-8-*- import arcpy import fileinput import os # 探矿权坐标格式举例 # 111.0846,31.1530 # 111.10 ...

  6. python读取坐标文本文件_使用python读取txt坐标文件生成挖空矿山_探矿批量

    # -*-coding:utf-8-*- import arcpy import fileinput import os # 探矿权坐标格式举例 # 111.0846,31.1530 # 111.10 ...

  7. python代码编译成pyd_python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用...

    python执行py文件的流程 当我们执行一个py文件的时候,直接python xx.py即可,那么这个流程是怎么样的呢.先说明一下,python执行代码实际上是先打开文件然后执行里面的代码,所以文件 ...

  8. SpringBoot -- 软件许可(License)证书生成+验证+应用完整流程

    一.项目目录树结构             由于时间有限,不可能在博客上花太多时间.也不可能每一个细节都说的很细,所以,下面的内容虽然一时间看着比较懵,但是文末有项目的GitHub地址,或者不懂的可以 ...

  9. Python将py文件生成exe文件

    使用PyCham软件运行生成可执行文件后,最完美的就是将py文件生成exe文件,这样可以任意复制移植到其他电脑上,供他人共享. 由于新手初步尝试,自己一个人摸索,遇到了很多坑.这里先给出最简单有效的方 ...

最新文章

  1. IOS8中SWIFT 弹出框的显示
  2. RabbitMQ消息队列系列教程(一)认识RabbitMQ
  3. python3.x中的生成器generator调用next方法
  4. 【组合数学】递推方程 ( 非齐次部分是指数的情况 | 非齐次部分是指数的情况示例 )
  5. pandas分批读取csv文件
  6. trait功能 php,PHP之Trait功能与用法实例分析
  7. centos tomcat 安装
  8. OpenCV—图像椒盐噪声生成器
  9. 中信银行MySQL面试_【深圳中信银行信用卡中心面试】面试题_面试经验_面试流程-看准网...
  10. 无锁数据结构--理解CAS、ABA、环形数组
  11. linux mysql配置修改_【Mysql】linux下mysql的配置修改
  12. 管理小故事 100例
  13. [可靠消息]2020美赛结果公布时间
  14. AI技术的苹果iPhone XS Max双卡双待7纳米6.5寸512GB顶配12799元(公号回复“苹果AI”下载PDF资料)
  15. 壮游奇迹哪个服务器稳定,壮游奇迹MU官方选哪个区好呢?
  16. IGMP协议(IGMPv1、IGMPv2、IGMPv3)
  17. ARC 138 A - Larger Score「二分 + 后缀最小值」
  18. 纯css position:sticky 实现表格首行和首列固定
  19. c语言volatile含义,c语言中volatile关键字是什么含义怎么办呢?
  20. python key=lambda函数_使用’key’和lambda表达式的python max函数

热门文章

  1. 嵌入式Linux移植littlevgl7,安富莱V6移植littlevgl的前因后果,附移植好的工程(未优化)...
  2. 1199:全排列(dfs)
  3. 一名年薪30W+的Java程序员讲解:想去大公司,前三年要懂些什么?
  4. qwt-QwtPlot
  5. AD pcb中无法选中铜层
  6. 工程项目计算机协同管理系统AUTODESK BUZZSAW平台在世博中心项目建设中的运用
  7. vb语言中怎样编码窗体中所有字体加粗_VB窗口属性中文对照表
  8. 代码随想录训练营day50
  9. 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。...
  10. addr2line工具的作用