Python加密模块的hashlib,hmac模块使用解析
这篇文章主要介绍了Python加密模块的hashlib,hmac模块使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在写搬砖脚本中,碰到一个加密的信号标签文件无法运行。
importhashlib importtime m=hashlib.md5() api_key='' api_secret='' params={'api_key':api_key,'time':int(time.time()),'symbol':'btclcny'} defsign(data,secret): signStr="" keys=data.keys() keys=sorted(keys) forkeyinkeys: signStr=signStr+key signStr=signStr+bytes(data[key]) pass signStr+=secret m.update(signStr) returnm.hexdigest() printsign(params,api_secret)
实在搞不懂写的人的意思,里面有字符串与字节码的相加?反正就是跑不起来,随便我这个加密模块也用的少,这次就给自己记录学习的机会来了。
妈的,这个平台太垃圾了,接口有问题的,浪费我好长时间,后面还去看了它的PHP代码,看的脑子发麻,后来仔细研究了传入params,里面的接口文档写的乱七八糟,浪费时间。一万头草泥马飞过。
切入主题,先讲hashlib,后面介绍hmac,有时间下一个章节,把base64还有io,以及pickle,json,shelve,fileinput.
概念:
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。所以看来的hash加密值没有超过字母f的
后面可以测试每种加密手法的输出字段长度,也可以知道具体输出的Byte字节数(一个16进制的数对应4位)。
'''初始化对象''' h1=hashlib.md5() h2=hashlib.new('md5') h3=hashlib.md5() h1.update(b'123')#进行摘要 h2.update('123'.encode()) h3.update(b'1') h3.update(b'23') print(h1.hexdigest())#取值 print(h2.hexdigest()) print(h3.hexdigest())
202cb962ac59075b964b07152d234b70202cb962ac59075b964b07152d234b70 202cb962ac59075b964b07152d234b70
一共有两种实例化的方法,一般介绍都是第一种。记住,进行进行md5摘要时,对象一定是二进制数据。
update其实可以分开用,只要里面的数据没有变,分开用书上介绍对大文件操作会更加快。
由于这样直接加密,没有添加辅助字符,假如是用户的密码设置的很简单,很容易通过加密后的数据也能反向分析出密码,所以要添加一些干扰词汇。
hmac也是干扰加密的另外一种相对看过去比较高级的写法。
add_word=b'haha'#把这个当做加密盐, hh1=hashlib.md5() hh1.update(add_word+b'jiujiu') print(hh1.hexdigest()) hh2=hashlib.md5() hh2.update(b'jiujiu'+add_word) print(hh2.hexdigest()) m=hmac.new(add_word)#这个跟hashlib的写法有点类似,默认是md5加密 m.update(b'jiujiu') print(m.hexdigest()) h_md5=hmac.new(add_word,b'jiujiu').hexdigest()#这是另外一种方式,直接加密后取值。 h_sha1=hmac.new(add_word,b'jiujiu','sha1').hexdigest() h_sha224=hmac.new(add_word,b'jiujiu','sha224').hexdigest() h_sha256=hmac.new(add_word,b'jiujiu','sha256').hexdigest() h_sha512=hmac.new(add_word,b'jiujiu','sha512').hexdigest() print(h_md5,len(h_md5),sep='======>num') print(h_sha1,len(h_sha1),sep='======>num')#通过输出可以看出,md5输出32个16进制数字,一共128位 print(h_sha224,len(h_sha224),sep='======>num')#sha1输出40个数字,所以为160位,剩下的sha后面的数字就代表输出几位。 print(h_sha256,len(h_sha256),sep='======>num') print(h_sha512,len(h_sha512),sep='======>num')
3e289c523f955430bce2e47a14d4934b eb01e09a1fe2bfd95d8f31c8ae544faf ef84bc9ee2bf91d1789227d82193d7a9 ef84bc9ee2bf91d1789227d82193d7a9======>num32 fbd95ddafdac6352cdf3d9d4e8c6d2421c80e56c======>num40 60d1896d00e73bc67469a58b39ded91c60c162eda0f44306f7d08d58======>num56 b36f8977bba6265612bc338b89c698d17cff7ccfb81b7d7a434f0ad889995e26======>num64 043f51bd410f9d328ca0ab0913ddfde9c2519f639c74447a1516811b8920b125aa6f4d3977c83e038e82c39103ac2a3bbdd5235c9c95fc030a267cdf0d578696======>num128
从整个代码的操作来看还是比较简单,至少比我想象的简单,加密的逻辑我也不懂,我也知道密码学很高级,就我这小学三年级的数学有空再看吧。
hmac只不过是一种机器加密的手段,但我试过了,无论我把这个加密盐放加密字节码的前面或者后面,跟hmac出来的效果不一样,看来它有自己的拼接加密算法。
至于sha1,sha256,sha512就比较容易记住了,md5是32个16进制数输出,所以包含bit是128位,sha1是是输出40个16进制数,所以是160个bit,剩下的比较好理解,后面的数字代表了几个bit位。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。