Python加密模块的hashlib,hmac模块使用解析


Posted in Python onJanuary 02, 2020

这篇文章主要介绍了Python加密模块的hashlib,hmac模块使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在写搬砖脚本中,碰到一个加密的信号标签文件无法运行。

import hashlib
import time
 
m = hashlib.md5()
 
api_key = ''
api_secret = ''
 
params = {'api_key':api_key, 'time':int(time.time()), 'symbol':'btclcny'}
 
def sign( data , secret ):
  signStr = ""
  keys = data.keys()
  keys = sorted(keys)
  for key in keys:
    signStr = signStr + key
    signStr = signStr + bytes(data[key])
    pass
  signStr += secret
  m.update(signStr)
  return m.hexdigest()
 
print sign( 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())
202cb962ac59075b964b07152d234b70<br data-filtered="filtered">202cb962ac59075b964b07152d234b70<br data-filtered="filtered">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位。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
python中 logging的使用详解
Oct 25 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python贪心算法实例小结
Apr 22 Python
python如何爬取个性签名
Jun 19 Python
将python图片转为二进制文本的实例
Jan 24 Python
python基于opencv检测程序运行效率
Dec 28 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
教你怎么用python实现字符串转日期
May 24 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 #Python
pytorch实现onehot编码转为普通label标签
Jan 02 #Python
pytorch标签转onehot形式实例
Jan 02 #Python
Python socket聊天脚本代码实例
Jan 02 #Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 #Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 #Python
Python for循环与getitem的关系详解
Jan 02 #Python
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php与java通过socket通信的实现代码
2013/10/21 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
再论Javascript的类继承
2011/03/05 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
详解Python locals()的陷阱
2019/03/26 Python
numpy.where() 用法详解
2019/05/27 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Python tornado上传文件的功能
2020/03/26 Python
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
教师个人自我评价范文
2014/04/13 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
毕业论文致谢词
2015/05/14 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android