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 continue语句用法实例
Mar 11 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python中 Lambda表达式全面解析
Nov 28 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
如何使用Cython对python代码进行加密
Jul 08 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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
使用PHP静态变量当缓存的方法
2013/11/13 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
对Python中的@classmethod用法详解
2018/04/21 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python多线程获取返回值代码实例
2020/02/17 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
公司担保书范文
2014/05/21 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
六一儿童节开幕词
2015/01/29 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
Java实现多线程聊天室
2021/06/26 Java/Android