python中hashlib模块用法示例


Posted in Python onOctober 30, 2017

我们以前介绍过一篇Python加密的文章:Python 加密的实例详解。今天我们看看python中hashlib模块用法示例,具体如下。

hashlib

hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法
具体应用

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#pyversion:python3.5
#owner:fuzj

import hashlib
# ######## md5 ########
string = "beyongjie"
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))   #注意转码
res = md5.hexdigest()
print("md5加密结果:",res)
# ######## sha1 ########
sha1 = hashlib.sha1()
sha1.update(string.encode('utf-8'))
res = sha1.hexdigest()
print("sha1加密结果:",res)
# ######## sha256 ########
sha256 = hashlib.sha256()
sha256.update(string.encode('utf-8'))
res = sha256.hexdigest()
print("sha256加密结果:",res)
# ######## sha384 ########
sha384 = hashlib.sha384()
sha384.update(string.encode('utf-8'))
res = sha384.hexdigest()
print("sha384加密结果:",res)
# ######## sha512 ########
sha512= hashlib.sha512()
sha512.update(string.encode('utf-8'))
res = sha512.hexdigest()
print("sha512加密结果:",res)

输出结果:

md5加密结果: 0e725e477851ff4076f774dc312d4748
sha1加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha256加密结果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4
sha384加密结果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b
sha512加密结果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073

注意:hashlib 加密啊的字符串类型为二进制编码,直接加密字符串会报如下错误:

sha1 = hashlib.sha1()
sha1.update(string)
res = sha1.hexdigest()
print("sha1加密结果:",res)

TypeError: Unicode-objects must be encoded before hashing

可以使用encode进行转换

shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest()
print("sha1采用encode转换加密结果:",res)

或者使用byte转换为二进制

shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()
print("sha1采用byte转换的结果:",res)

以上输出:

sha1采用encode转换加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha1采用byte转换的结果: 458d32be8ea38b66300174970ab0a8c0b734252f

常用方法

hash.update(arg) 更新哈希对象以字符串参数, 注意:如果同一个hash对象重复调用该方法,则m.update(a); m.update(b) 等效于 m.update(a+b),看下面例子

m = hashlib.md5()
m.update('a'.encode('utf-8'))
res = m.hexdigest()
print("第一次a加密:",res)
m.update('b'.encode('utf-8'))
res = m.hexdigest()
print("第二次b加密:",res)

m1 = hashlib.md5()
m1.update('b'.encode('utf-8'))
res = m1.hexdigest()
print("b单独加密:",res)
m2 = hashlib.md5()
m2.update('ab'.encode('utf-8'))
res = m2.hexdigest()
print("ab单独加密:",res)

输出结果:
第一次a加密: 0cc175b9c0f1b6a831c399e269772661
第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0
b单独加密: 92eb5ffee6ae2fec3ad71c777531578f
ab单独加密: 187ef4436122d1cc2f40dc2b92f0eba0

hash.digest() 返回摘要,作为二进制数据字符串值,

hash.hexdigest() 返回摘要,作为十六进制数据字符串值,

hash.copy() 复制

高级加密

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

low = hashlib.md5()
low.update('ab'.encode('utf-8'))
res = low.hexdigest()
print("普通加密:",res)
high = hashlib.md5(b'beyondjie')
high.update('ab'.encode('utf-8'))
res = high.hexdigest()
print("采用key加密:",res)
输出结果:
普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
采用key加密: 1b073f6b8cffe609751e4c98537b7653

附加HMAC-SHA1各语言版本实现

在各大开放平台大行其道的互联网开发潮流中,调用各平台的API接口过程中,无一例外都会用到计算签名值(sig值)。而在各种计算签名的方法中,经常被采用的就是HMAC-SHA1,现对HMAC-SHA1做一个简单的介绍:

        HMAC,散列消息鉴别码,基于密钥的Hash算法认证协议。实现原理为:利用已经公开的Hash函数和私有的密钥,来生成固定长度的消息鉴别码;

       SHA1、MD5等Hash算法是比较常用的不可逆Hash签名计算方法;

       BASE64,将任意序列的8字节字符转换为人眼无法直接识别的符号编码的一种方法;

       各个语言版本的实现为:

       Python版:

import hmac
       import hashlib
       import base64
       hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()

Token:即接口的key

data:要加密的数据

       PHP版:

base64_encode(hash_hmac("SHA1",clientStr,Token , true))

          C++版(Openssl):

HMAC( EVP_sha1(),
          /*key data*/ strKey.data(),
          /*key len*/ strKey.size(),
          /*data */(unsigned char*) strRandom.data(),
          /*data len*/ strRandom.size(), digest, &digest_len))

       Shell版:

echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64

总结

以上就是本文关于python中hashlib模块用法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈Python由__dict__和dir()引发的一些思考、浅谈使用Python变量时要避免的3个错误等,感谢朋友们对本站的支持!

Python 相关文章推荐
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
Python对象转换为json的方法步骤
Apr 25 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
如何基于python测量代码运行时间
Dec 25 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
Python数据分析入门之数据读取与存储
May 13 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 #Python
Android分包MultiDex策略详解
Oct 30 #Python
Python 判断是否为质数或素数的实例
Oct 30 #Python
基于Python __dict__与dir()的区别详解
Oct 30 #Python
浅谈使用Python变量时要避免的3个错误
Oct 30 #Python
Python中进程和线程的区别详解
Oct 29 #Python
python logging日志模块的详解
Oct 29 #Python
You might like
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
django框架ModelForm组件用法详解
2019/12/11 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
公司营业员的自我评价
2014/03/04 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
先进学校事迹材料
2014/12/30 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
开业典礼致辞
2015/07/29 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
python开发人人对战的五子棋小游戏
2022/05/02 Python
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS