基于python脚本实现软件的注册功能(机器码+注册码机制)


Posted in Python onOctober 09, 2016

一、前言:

目的:完成已有python图像处理工具的注册功能

功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册。注册过程是用户将程序运行后显示的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后生成加密文件或字符串返回给用户。每次启动程序,在有注册文件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号比对,如果一致则运行主程序。如果注册文件解码后与卷序号不一致,就要提醒用户输入注册码,如果对新输入的解码后和重新获取的机器码一致,则通过认证,生成新的注册文件后进入主程序。

库和组件:

1、pyDes用于加密解密

2、base64,用于pyDes加密解密后的二次加密解密

3、win32api,用于获取C盘卷序列号

4、pyinstaller,打包

参考:

1、pyDes库 实现python的des加密

http://www.mamicode.com/info-detail-508384.html

http://twhiteman.netfirms.com/des.html

2、win32api.GetVolumeInformation

http://timgolden.me.uk/pywin32-docs/win32api__GetVolumeInformation_meth.html

3、pyinstaller打包文件说明

http://pythonhosted.org/PyInstaller/spec-files.html#using-spec-files

二、实现

#coding:utf8
#register.py
#功能说明:用户运行程序后,自动检测认证状态,如果未经认证,就需要注册。注册过程是用户将程序运行后显示的机器码(卷序号)发回给管理员,管理员通过加密后生成加密文件或字符串给回用户。
#每次登录,在有注册文件或者注册码的情况下,软件就会通过DES和base64解码,如果解码后和重新获取的机器码一致,则通过认证,进入主程序。
import base64
import win32api
from pyDes import *
#from binascii import a2b_hex #如果需要用二进制编码保存注册码和注册文件可以使用binascii转换
class register:
def __init__(self):
self.Des_Key = "BHC#@*UM" # Key
self.Des_IV = "\x22\x33\x35\x81\xBC\x38\x5A\xE7" # 自定IV向量
#获取C盘卷序列号
#使用C盘卷序列号的优点是长度短,方便操作,比如1513085707,但是对C盘进行格式化或重装电脑等操作会影响C盘卷序列号。
#win32api.GetVolumeInformation(Volume Name, Volume Serial Number, Maximum Component Length of a file name, Sys Flags, File System Name)
#return('', 1513085707, 255, 65470719, 'NTFS'),volume serial number is 1513085707.
def getCVolumeSerialNumber(self):
CVolumeSerialNumber=win32api.GetVolumeInformation("C:\\")[1]
#print chardet.detect(str(CVolumeSerialNumber))
#print CVolumeSerialNumber
if CVolumeSerialNumber:
return str(CVolumeSerialNumber) #number is long type,has to be changed to str for comparing to content after.
else:
return 0
#使用DES加base64的形式加密
#考虑过使用M2Crypto和rsa,但是都因为在windows环境中糟糕的安装配置过程而放弃
def DesEncrypt(self,str):
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
EncryptStr = k.encrypt(str)
#EncryptStr = binascii.unhexlify(k.encrypt(str))
return base64.b64encode(EncryptStr) #转base64编码返回
#des解码
def DesDecrypt(self,str):
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
DecryptStr = k.decrypt(str)
#DecryptStr = a2b_hex(k.decrypt(str))
print DecryptStr
return DecryptStr
#获取注册码,验证成功后生成注册文件
def regist(self):
key = raw_input('please input your register code: ')
#由于输入类似“12”这种不符合base64规则的字符串会引起异常,所以需要增加输入判断
#while key
if key:
content = self.getCVolumeSerialNumber() //number has been changed to str type after use str() 
#print chardet.detect(content)
#print type(content)
#print content
#type(key_decrypted) is str
key_decrypted=str(self.DesDecrypt(base64.b64decode(key)))
#print chardet.detect(key_decrypted)
#print key_decrypted
#type(key_decrypted) is str
if content!=0 and key_decrypted!=0:
if content != key_decrypted:
print "wrong register code, please check and input your register code again:"
self.regist()
elif content==key_decrypted:
print "register succeed."
#读写文件要加判断
with open('./register','w') as f:
f.write(key)
f.close()
return True
else:
return False
else:
return False
else:
self.regist()
return False
def checkAuthored(self):
content=self.getCVolumeSerialNumber()
checkAuthoredResult = 0
#读写文件要加判断
try:
f=open('./register','r')
if f:
key=f.read()
if key:
key_decrypted=self.DesDecrypt(base64.b64decode(key))
if key_decrypted:
if key_decrypted == content:
checkAuthoredResult = 1
else:
checkAuthoredResult = -1
else:
checkAuthoredResult = -2
else:
checkAuthoredResult = -3
else:
self.regist()
except IOError:
print IOError
print checkAuthoredResult
return checkAuthoredResult
if __name__ == '__main__':
reg=register()
reg.regist()

三、备注

1、使用C盘卷序列号而不是硬盘号的原因是:位数短,方便操作。

但是使用硬盘号才是更安全的做法,因为硬盘号不会因重装系统、格式化C盘或修改C盘序号而改变。

#CVolumeSerialNumber: 1513085707
#after encryption: ro5RVXZoP0KmnogYDeepUg==
#the HardDiskNumber: 32535332584e4741343536393237204620202020
#after encryption: MzI1MzUzMzI1ODRlNDc0MTM0MzUzNjM5MzIzNzIwNDYyMDIwMjAyMA==

2、除了win32api,wmi也可以用来获取系统信息(比如硬盘号),获取完整硬盘号的过程如下:

#虽然使用wmi可以获取磁盘序列号,可是磁盘序列号是3253533258**************3237204620202020,加密后太长,不方便操作,所以弃置
import wmi
def getHardDiskNumber(self):
c = wmi.WMI()
for physical_disk in c.Win32_DiskDrive():
return physical_disk.SerialNumber

https://pypi.python.org/pypi/WMI/

3、chardet可以用来检验字符串的编码类型,可以用在检测字符串相等上

chardet.detect(str)

4、还存在一些逻辑上的漏洞,比如读写文件时对文件是否存在的判断,读取方式的选择等

5、register.py,供main函数或其他需要获取认证状态的函数调用。

main函数中使用register类的过程是:

创建logIn函数用于获取认证结果-》如果认证结果为假则重新调用register类的regist函数,提醒用户输入注册码,只有成功输入了注册码才能创建新的注册文件-》如果认证结果为真则直接启动主程序。

6、管理员还应该有一个encryption.py,用于使用des+base64算法对用户发过来的C盘卷序列号进行加密,加密以后生成字符串或注册文件,再返还给用户,不再赘述。

以上所述是小编给大家介绍的基于python脚本实现软件的注册功能(机器码+注册码机制),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python Django连接MySQL数据库做增删改查
Nov 07 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
django反向解析和正向解析的方式
Jun 05 Python
从0开始的Python学习016异常
Apr 08 Python
Centos7 下安装最新的python3.8
Oct 28 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
python文件路径操作方法总结
Dec 21 Python
python连接mysql实例分享
Oct 09 #Python
Python中运算符"=="和"is"的详解
Oct 08 #Python
Python 爬虫多线程详解及实例代码
Oct 08 #Python
python字符串,数值计算
Oct 05 #Python
python制作企业邮箱的爆破脚本
Oct 05 #Python
python爬取NUS-WIDE数据库图片
Oct 05 #Python
python2.7的编码问题与解决方法
Oct 04 #Python
You might like
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
封装好的一个万能检测表单的方法
2015/01/21 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
药学专业个人的自我评价
2013/12/31 职场文书
教师远程培训感言
2014/03/06 职场文书
生物工程专业求职信
2014/09/03 职场文书
被告代理词范文
2015/05/25 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
Python 发送SMTP邮件的简单教程
2021/06/24 Python
Python函数中apply、map、applymap的区别
2021/11/27 Python