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

sklearn实战-乳腺癌细胞数据挖掘

https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

 

 

一、前言:
目的:完成已有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盘卷序列号进行加密,加密以后生成字符串或注册文件,再返还给用户,不再赘述。

 

转载请注明出处:

http://www.cnblogs.com/cquptzzq/

python风控评分卡建模和风控常识

https://study.163.com/course/introduction.htm?courseId=1005214003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

转载于:https://www.cnblogs.com/webRobot/p/6351454.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

原文:Win10 UWP开发系列:使用VS2015 Update2ionic开发第一个Cordova App安装VS2015 Update2的过程是非常曲折的。还好经过不懈的努力,终于折腾成功了。 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错。对于Cor…

[Swift]LeetCode1035.不相交的线 | Uncrossed Lines

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…

php sql语句过滤,php如何做sql过滤

php如何做sql过滤SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入…

Oracle Sql 胡乱记

/Oracle查询优化改写/ --1、coalesce 返回多个值中,第一个不为空的值 select coalesce(, , s) from dual; --2、order by -----dbms_random.value 生产随机数,利用随机数对查询结果进行随机排序 select * from emp order by dbms_random.value; --指定查询结果中的一…

Object Pools 喷泉效果实现

摘录自:http://catlikecoding.com/unity/tutorials/object-pools/ 工程 效果图 工程里面有响应的注释 源码我就不单独放出来了

本地模式运行spark streaming程序(win7安装nc命令通信)

2019独角兽企业重金招聘Python工程师标准>>> 首先在win7上安装nc命令 下载nc程序包,放在c盘目录下,cmd打开命令行,进入nc目录,执行:nc -l -L -p 8888开始监控。再打开一个命令行窗口进入nc目录,…

如何用js获取浏览器URL中查询字符串的参数

首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主机名和当前的URL的端口号。本博客首页返回www.cnblogs.com hostname:设置或返回当前URL的主机名。本博客首页返…

计算机系统的数制及转换

1、计算机的数制介绍 数制:计数的方法,指用一组固定的符号和统一的规则来表示数值的方法 数位:指数字符号在一个数中所处的位置 基数:指在某种进位计数制中,数位上所能使用的数字符号的个数 位权:指在某种进…

29. ExtJs - Struts2 整合(1) - 登录页面

转自:https://yarafa.iteye.com/blog/729197 初学 ExtJS,在此记录下学习过程中的点点滴滴,以备不时只需,也希望能给跟我一样的菜鸟一些帮助,老鸟请忽略。如有不当之处,欢迎指正。 开发环境: MyE…

git php框架,如何用Git安装TP框架

本篇文章主要给大家介绍如何用Git安装Thinkphp框架。关于TP框架的安装,想必大家都知道较为常见的方式是通过composer安装tp框架。首先简单的给大家介绍下Git和TP框架。Git是一个开源的分布式版本控制系统,可以快速,高效地处理从小型到大型项目…

C#EF中,使用类似于SQL中的% 模糊查询

最近在做项目的时候需要使用到模糊查询,但是后台使用EF写的 而不是ADO或者是Dapper,如果是这样的话,我们就可以使用Sql语句直接进行模糊查询 现在我们需要在LINQ中使用类似于模糊查询 在EF中有两个方法:StartsWith()和EndWith() StartsWith(): 在转到定义时 我们可以看见,这个方…

php snoopy视频教程,php的Snoopy类

用了两天这个类,发现很好用。获取请求网页里面的所有链接,直接使用fetchlinks就可以,获取所有文本信息使用fetchtext(其内部还是使用正则表达式在进行处理),还有其它较多的功能,如模拟提交表单等。使用方法&#xff1a…

城轨列控系统

关于列控系统想问的问题 1)列控系统的组成? 2)城轨列控系统和列控系统有哪些区别? 3)列控系统的设备图片? 4)列控系统的作用? 1、地铁的供电部分: 参考:http:…

4、Orcal数据库dmp文件导入

1、CMD命令导入备份数据库dmp文件: 以上一篇博客提到的gdnh用户,我们需要在cmd窗口执行如下命令: imp gdnh/admin123orcl fileE:/createTable.dmp fully 截图说明: 导入成功的标志: 导入完成之后刷新表: 转…

iOS APP 安全测试

1、ipa包加壳 首先,我们可以通过iTunes 下载 AppStore的ipa文件(苹果 把开发者上传的ipa包 进行了加壳再放到AppStore中),所以我们从AppStore下载的ipa都是加壳的,所以不能直接用来反编译。 得到ipa文件 可以分析APP 里包含的一些资源&#x…

oracle 与 client端执行结果不一致_Oracle -PLSQLDeveloper 13 数据库连接

关于oracle 及PLSQLDeveloper 13如何下载,安装流程不一一赘述,网络帖子很多,知乎直接搜索亦可。本次主要分享:学习前辈们关于安装流程中出现设置报错,应如何处理(本人个例,通过网络找思路&#…

Redis——学习之路一(初识redis)

在接下来的一段时间里面我要将自己学习的redis整理一遍,下面是我整理的一些资料: Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store),所以redis是可以查看源代码https://github.com/MSOpenTe…

css----实现checkbox图片切换

1、效果图 2、代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>checkbox</title><style type"text/css">label {width: 20px;font-size: 12px;cursor: pointer;}label i {display: inline-block…

【无删减】Python老司机收藏夹的17个国外免费学习网站

用Python编写代码一点都不难&#xff0c;事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发&#xff0c; Python是一个不错的开始&#xff0c;甚至想做游戏的话&#xff0c;用Python来开发游戏的资源也有很多。这是快速学习这门语言的途径之一。许多程序员都把Py…

iframe vue 前进 后退_vue常见面试题

1、说说你对 SPA 单页面的理解&#xff0c;它的优缺点分别是什么&#xff1f;SPA&#xff08; single-page application &#xff09;仅在 Web 页面初始化时加载相应的 HTML、JavaScript 和 CSS。一旦页面加载完成&#xff0c;SPA 不会因为用户的操作而进行页面的重新加载或跳转…