国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

基于python腳本實現軟件的注冊功能(機器碼+注冊碼機制)

2020-01-04 17:23:40
字體:
來源:轉載
供稿:網友

一、前言:

目的:完成已有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 base64import win32apifrom pyDes import *#from binascii import a2b_hex #如果需要用二進制編碼保存注冊碼和注冊文件可以使用binascii轉換class register:def __init__(self):self.Des_Key = "BHC#@*UM" # Keyself.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 CVolumeSerialNumberif 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 DecryptStrreturn DecryptStr#獲取注冊碼,驗證成功后生成注冊文件def regist(self):key = raw_input('please input your register code: ')#由于輸入類似“12”這種不符合base64規則的字符串會引起異常,所以需要增加輸入判斷#while keyif 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 strkey_decrypted=str(self.DesDecrypt(base64.b64decode(key)))#print chardet.detect(key_decrypted)#print key_decrypted#type(key_decrypted) is strif 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 Trueelse:return Falseelse:return Falseelse:self.regist()return Falsedef 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 = 1else:checkAuthoredResult = -1else:checkAuthoredResult = -2else:checkAuthoredResult = -3else:self.regist()except IOError:print IOErrorprint checkAuthoredResultreturn checkAuthoredResultif __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 wmidef 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腳本實現軟件的注冊功能(機器碼+注冊碼機制),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 基隆市| 贡嘎县| 盈江县| 怀来县| 邹城市| 怀柔区| 达日县| 信宜市| 绩溪县| 锡林浩特市| 翁源县| 宾川县| 邮箱| 柘荣县| 龙井市| 昌乐县| 家居| 湖南省| 壤塘县| 蒙阴县| 垣曲县| 崇信县| 固安县| 卓资县| 大方县| 松阳县| 久治县| 湘阴县| 城固县| 紫云| 温宿县| 南乐县| 宣武区| 辽宁省| 广昌县| 台湾省| 铁岭县| 武隆县| 明溪县| 黑河市| 安化县|