基于python脚本实现软件的注册功能(机器码+注册码机制)
⼀、前⾔:
⽬的:完成已有python图像处理⼯具的注册功能
功能:⽤户运⾏程序后,通过⽂件⾃动检测认证状态,如果未经认证,就需要注册。注册过程是⽤户将程序运⾏后显⽰的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后⽣成加密⽂件或字符串返回给⽤户。每次启动程序,在有注册⽂件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号⽐对,如果⼀致则运⾏主程序。如果注册⽂件解码后与卷序号不⼀致,就要提醒⽤户输⼊注册码,如果对新输⼊的解码后和重新获取的机器码⼀致,则通过认证,⽣成新的注册⽂件后进⼊主程序。
库和组件:
1、pyDes⽤于加密解密
2、base64,⽤于pyDes加密解密后的⼆次加密解密
3、win32api,⽤于获取C盘卷序列号
4、pyinstaller,打包
参考:
1、pyDes库实现python的des加密
2、win32api.GetVolumeInformation
3、pyinstaller打包⽂件说明
⼆、实现
#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 = " 22 33 35 81 BC 38 5A E7" # ⾃定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.pt(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 = CVolumeSerialNumber() //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:"
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:
return False
def checkAuthored(self):
CVolumeSerialNumber()
checkAuthoredResult = 0
#读写⽂件要加判断
try:
f=open('./register','r')
if f:
ad()
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:
except IOError:
print IOError
print checkAuthoredResult
return checkAuthoredResult
if __name__ == '__main__':
reg=register()
三、备注
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
3、chardet可以⽤来检验字符串的编码类型,可以⽤在检测字符串相等上
chardet.detect(str)
4、还存在⼀些逻辑上的漏洞,⽐如读写⽂件时对⽂件是否存在的判断,读取⽅式的选择等
5、register.py,供main函数或其他需要获取认证状态的函数调⽤。
main函数中使⽤register类的过程是:
创建logIn函数⽤于获取认证结果-》如果认证结果为假则重新调⽤register类的regist函数,提醒⽤户输⼊注册码,只有成功输⼊了注册码才能创建新的注册⽂件-》如果认证结果为真则直接启动主程序。
6、管理员还应该有⼀个encryption.py,⽤于使⽤des+base64算法对⽤户发过来的C盘卷序列号进⾏加密,加密以后⽣成字符串或注册⽂件,再返还给⽤户,不再赘述。
以上所述是⼩编给⼤家介绍的基于python脚本实现软件的注册功能(机器码+注册码机制),希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论