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中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
python scatter函数用法实例详解
Feb 11 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
python 使用三引号时容易犯的小错误
Oct 21 Python
深入理解Pytorch微调torchvision模型
Nov 11 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
星际玩家的三大定律
2020/03/04 星际争霸
PHP 采集程序 常用函数
2008/12/18 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
thinkphp分页集成实例
2017/07/24 PHP
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
Python实现删除文件但保留指定文件
2015/06/21 Python
浅谈Python的异常处理
2016/06/19 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python实现贪吃蛇游戏
2020/03/21 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
np.dot()函数的用法详解
2020/01/17 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
环保建议书500字
2014/05/14 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
电影复兴之路观后感
2015/06/02 职场文书