一:hashlib简介1.什么是hash:hash是一种算法(不同的hash算法只是复杂度不同)(3.x替换了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法),该算法接受传入的内容,计算后得到一串哈希值。2、哈希值的特征是(哈希值/产品具有三大特征:):2.1.只要输入的内容相同,得到的哈希值一定相同=====>使用明文传输密码文件完整性校验2.2.哈希值不能返回内容=======》把密码做成哈希值,明文密码不要在网络上传输(只有内容才能返回哈希值)下载来自互联网的文件需要进行hash校验,以保证网络传输不丢包)。基于2.1和2.3,可以做文件下载一致性校验。基于2.1和2.2,可以对用户密码进行加密。hash算法为像一个工厂,工厂接受你发来的原材料(你可以用m.update()给工厂送原材料),处理后返回的产品就是哈希值2:加密指定的“字符串”.使用hashlib一步步分析1)在进行md5哈希运算之前,需要对数据进行编码,否则会报错importhashlibobj=hashlib.md5()#构造一个hashlib对象obj.update("小马CrossingtheRiver")#update加密指定字符串print(obj)--------------Result:obj.update("小马过河")TypeError:Unicode-objectsmustbeencodedbeforehashing2)obj是一个hash对象importhashlibobj=hashlib.md5()obj.update("小马过河".encode("utf-8"))print(obj,type(obj))-----------------结果:3)importhashlibobj=hashlib.md5()obj.update("Little马过河".encode("utf-8"))result=obj.hexdigest()print(result)------------Result:24f67b0f6d02adc8867d612e0e0fc40a4)adddifficultytoencryptionimporthashlibobj=hashlib.md5("mcw@xiaoma@aaaaffffff".encode("utf-8"))#增加一些内容增加加密复杂度.这里的字符串也要先编码,obj.update("小马过河".encode('utf-8'))result=obj.hexdigest()print(result)------------------Result:b11740508f28e04837f2c0e3a58cf9905)使用hashlib做一个加密函数(添加了基本字符)importhashlibdefget_md5(data):#将参数作为待加密的字符串传递obj=hashlib.md5(“sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad”.encode('utf-8'))obj.update(data.encode('utf-8'))result=obj.hexdigest() returnresultval=get_md5('123')print(val)------------结果:35093270b6352fa9721370b781f7b4d7三:应用场景案例:用户账号密码登录,加密明文密码importhashlibUSER_LIST=[]defget_md5(data):obj=hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))obj.update(data.encode('utf-8'))结果=obj.hexdigest()returnresultdefregister():print('**************用户注册******************')whileTrue:user=input('请输入用户名:')ifuser=='N':returnpwd=input('请输入密码:')temp={'username':user,'password':get_md5(pwd)}USER_LIST.append(temp)deflogin():print('**************用户登录******************')user=input('请输入您的用户名:')pwd=input('请输入您的密码:')foriteminUSER_LIST:ifitem['username']==useranditem['password']==get_md5(pwd):returnTrueregister()result=login()ifresult:print('登录成功')else:print('登录失败')---------------------结果:*****************************************************************************************************************************************************N************************************************************************************************************************************************************************************************分析:实现用户注册,然后对用户登录进行代码分析代码分析:1、用户登录需要密码,密码必须加密,以保证用户信息安全。 1)加密可以使用hashlib模块进行加密。 2)加密可以写成加密函数 3)增加密码解密的复杂度,在代码中加入更多的字符串。(虽然加密算法还是很强大的,但是也有缺陷,就是可以通过崩溃来逆转,所以需要在加密算法中加入一个自定义的key,然后再加密。)2.用户注册是写成用户注册函数。登录被编写为用户登录的功能。3.先执行用户注册函数,再执行用户登录函数4.注册和登录需要交互,使用input函数接收用户输入5.如果用户注册和用户登录使用死循环,那么就是必要时确定使用什么终止循环(比如这里输入N)6.将用户注册提交的密码加密后的密文写入数据库,将用户注册提交的密码加密后的密文写入数据库。7、用户登录时输入的密码用相同的加密函数加密,并与数据库密文进行比对。如果相等,则登录失败。8、登录的本质是判断用户收到的加密密文和注册时保存在数据库中的密文。密文比对,用户名密文比对成功,登录后继续执行操作。9.为防止他人看到用户密码,可以使用getpass模块。10、密码很重要,一定要加密。包括自己拥有的影响力大的重要数据,也要进行加密,防止黑客获取和泄露。4、验证文件的一致性(如何保证下载文件在下载过程中不丢失,保证下载数据的完整性)#------------文件一致性验证---------------'''可以复制一个文件,分别放在两个不同的磁盘中,然后通过判断hash值是否相同来判断两个文件是否是同一个文件两个文件的相等'''importhashlibm=hashlib.md5()withopen(r'G:/loggingmodulemap.png','rb')asf:forlineinf:m.update(行)打印(m.hexdigest())#47a6b079cc33a4f312786b46e61e0305importhashlibm=hashlib.md5()withopen(r'H:/loggingmodulemap.png','rb')asf:forlineinf:m.update(line)print(m.hexdigest())5.加密明文密码#应用:加密明文密码(暴力破解------用明文密码用算法算出一个hash值,对比一下与截获的哈希值,如果是明文密码,则比较成功rd相同,可以破解用户密码)'''如果用户在某个网站注册信息,此时为防止信息被恶意截取获取,可以将用户的明文密码加密保存在形式的hash值,这样用户每次登录输入的虽然是明文密码,但是只要验证hash值'''password=input('>>>>>:').strip()importhashlibm=hashlib.md5()m.update(password.encode('utf-8'))print(m.hexdigest())#00dcbdaede875d5e23f1f9f64c7849ef#加盐密码(password)--------进一步加强密码的安全性password=input('>>>>>:').strip()importhashlibm=hashlib.md5()m.update('蓝天白鹭一行'.encode('utf-8'))#配对密码添加saltm.update(password.encode('utf-8'))print(m.hexdigest())6.破解用户注册的密码#重点'''模拟crunching库破解密码'''importhashlibpasswds=[#passwds中的内容可以通过随机实现'alex3714','alex1313','alex94139413','alex123456','123456alex','a123lex',]defmake_passwd_dic(passwds):#通过明文passwds中的passwd,创建同样对应的hash值字典dic={}:m=hashlib.md5()#使用md5算法构建工厂m.update(passwd.encode('utf-8'))#把原材料送到工厂(也就是我们要加密的内容)dic[passwd]=m.hexdigest()#输出哈希值(也就是最终产品),加入到空字典中我们提前做好了,字典形式:{password:hashValue}returndicdefbreak_code(cryptograph,passwd_dic):#判断截取的hash值是否等于字典中预先创建的hash值,如果equal,passwd_dic.items()中的k,v破解成功:ifv==cryptograph:print('Thepasswordis===>\033[46m%s\033[0m'%k)cryptograph='aee949757a2e698417463d47acac93df'#我们截取得到的密码,加密后的哈希值break_code(cryptograph,make_passwd_dic(passwds))#将待破解密码的哈希值和事先创建的哈希字典传递给对应的形参作为实参功能,hmac模块的加密方式和hashlib类似'''python也有一个hmac模块,在内部对我们创建的密钥和内容进行进一步的处理然后加密:'''importhmach=hmac.new('Heavenly王盖地虎'.encode('utf8'))#hmac必须加salth.update('hello'.encode('utf8'))print(h.hexdigest())#1abaae8f65f68f2695a8545c5bc8e738#以确保最终结果hmac是一致的,必须保证:#1:hmac.new中括号中指定的初始key是相同的#2:无论更新多少次,加在一起验证的内容都是一样的#下面single的方法得到的结果是一样的update(b'world')print(h1.hexdigest())h2=hmac.new(b'tom')#初始值必须一致,最终结果会不同h2.update(b'helloworld')打印(h2.hexdigest())h3=hmac.new(b'tomhelloworld')#初始值不一样,所以和上面两个结果不一样收藏完电子书2视频福利2Python