完成软件开发后,将软件给到用户使用,但是你只希望给固定的用户或固定的电脑使用,这时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. 计算机毕业优秀作品展观后感,信息学院毕业设计作品展观后感
  2. 【ABAP】报表进度提示
  3. AndroidStudio中提示:uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in libr
  4. JavaFX官方教程(四)之Hello World,JavaFX样式
  5. 安卓系统曝漏洞!有人可能正在用你的手机秘密拍照
  6. 怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
  7. 创建第一个RMI应用
  8. CPU 是如何工作的?
  9. rexpathbs4
  10. 64位win10下安装xgboost python包的教程
  11. python flask智能租房项目——详情页
  12. CMMI 4高级别过程改进案例介绍
  13. flutter 截图 截长图 滚动截图 保存到手机
  14. 服务器备案全流程超级详细
  15. 原笔迹手写实现平滑和笔锋效果之:笔迹的平滑(一)
  16. 山东理工 ACM [1011] A+B for Input-Output Practice (II)
  17. 40岁开始学编程,现在成了一名技术主管
  18. 《计算广告》学习笔记(四)
  19. html表格一行设置颜色,更改表格中一行的颜色,html
  20. Weston 纹理倒置(render-gl)

热门文章

  1. Oracle -- DBA常用SQL
  2. Unix/Linux编程:进程间通信(IPC)总结
  3. 联想拯救者r720自带win10安装linux(ubuntu)双系统
  4. 常见端口号以及对应的作用
  5. 如何科学养一只鸽子为你飞鸽传书——程序间异步通信_莫韵乐的Linux英雄传
  6. 多普勒流速仪用于珠海市政污水流量监测
  7. 无穷小微积分基础大曝光,重拳出击数学守旧派
  8. 点击按钮控制滚动条滚动
  9. **如何在catia工程图中自定义新的制图标准**
  10. 安全siem_当时和现在的安全相关性是关于siem的可悲事实