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调用cmd复制文件代码分享
Dec 27 Python
使用Python中的cookielib模拟登录网站
Apr 09 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
使用Python函数进行模块化的实现
Nov 15 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 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
使用eAccelerator加密PHP程序
2008/10/03 PHP
php目录拷贝实现方法
2015/07/10 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
可以将word转成html的js代码
2010/04/11 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
移动端界面的适配
2017/01/11 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
node跨域请求方法小结
2017/08/25 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
python字符串,数值计算
2016/10/05 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
Hibernate持久层技术
2013/12/16 面试题
建筑安全员岗位职责
2014/03/13 职场文书
关于环保的建议书
2014/05/12 职场文书
汽车转让协议书
2015/01/29 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python