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交换变量
Sep 06 Python
Python代理抓取并验证使用多线程实现
May 03 Python
python教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
python 连接sqlite及简单操作
Jun 30 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
python实现交并比IOU教程
Apr 16 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 zend解密软件绿色版测试可用
2008/04/14 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
Python中的zip函数使用示例
2015/01/29 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
python 从list中随机取值的方法
2020/11/16 Python
python常量折叠基础知识点讲解
2021/02/28 Python
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
应聘自荐书
2013/10/08 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
爱心活动计划书
2014/04/26 职场文书
党员剖析材料范文
2014/09/30 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
先进个人推荐材料
2014/12/29 职场文书
开票员岗位职责
2015/02/12 职场文书
户外亲子活动总结
2015/05/08 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL