python3中的md5加密实例


Posted in Python onMay 29, 2018

在python3的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。

另:在网上找关于python的md5加密,发现要不是比较旧的不适用当前py版本的文章,或者是说得不够清楚的文章,所以还是自己去看下官方文档比较好,顺便整理下关于md5的使用方法。

对于学习任何一门程序类知识,我都认为去看官方文档这种学习方式最有效的之一,只不过一般这些文档都是英文版的,对于一些学习者来说可能会有一定门槛,但习惯于阅读英文文章,是非常重要的。

建议直接阅读python3的hashlib文档:

https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits

在hashlib库的hash算法中,提供了很多加密算法,有 sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()和 blake2s()、md5(),这些方法都通过统一接口返回一个对象,例如,使用sha256()可以创建一个SHA-256的哈希对象。

当然,进行md5加密算法,就要用到md5()方法:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'

# 或者可以这样
>>> hashlib.md5(b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

# 也可以使用hash.new()这个一般方法
>>> hashlib.new('md5', b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

以上是对于英文进行md5加密的,如果要对中文进行加密,发现按照上面来写会报错,原因在于字符转码问题,要如下写:

>>> import hashlib
>>> data = '你好'
>>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

此处先将数据转换成UTF-8格式的,使用网上工具对比下加密的结果,发现有的md5加密工具并不是使用UTF-8格式加密的。

经测试目前发现可以转为UTF-8、GBK、GB2312、GB18030,不分大小写(因为GBK/GB2312/GB18030均是针对汉字的编码,所以md5加密后结果一样)。

除了这些编码格式之外,还会有其他编码的,目前还没发现,等各位补充。

看下面实例:

>>> hashlib.md5('你好'.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

>>> hashlib.md5('你好'.encode(encoding='GBK')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB2312')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB18030')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

如果你仅仅查md5的写法,看上面实例就够了;

如果你是python新手,想了解这些方法的意思和用法,继续看下面内容。

解析

1. hashlib.new(name[, data])方法

这是个一般性方法。

name传入的是哈希加密算法的名称,如md5;

data传入的是需要加密的数据,可忽略,在之后update()中传入。

>>> m = hashlib.new('md5')
>>> m.update(b'123456')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'

可以使用hashlib.algorithms_guaranteed或者hashlib.algorithms_available这两个内置属性查看hashlib支持哪些加密算法。

hashlib.algorithms_guaranteed是在所有平台上,保证被hashlib模块支持的hash算法名称的集合;

hashlib.algorithms_available是在当前运行的python编译器可用的hash算法名称的集合,由于OpenSSL的原因,在这当中可能会出现重复的hash算法名称。

hashlib.algorithms_guaranteed是hashlib.algorithms_available的子集。

看下面输出:

>>> hashlib.algorithms_guaranteed
{'sha3_384', 'md5', 'blake2s', 'sha3_512', 'blake2b', 'shake_128', 'sha384', 'sha3_256', 'sha1', 'shake_256', 'sha3_224', 'sha512', 'sha256', 'sha224'}
>>> hashlib.algorithms_available
{'whirlpool', 'ripemd160', 'dsaEncryption', 'sha1', 'SHA224', 'sha512', 'sha256', 'SHA512', 'blake2s', 'blake2b', 'SHA256', 'sha384', 'sha3_256', 'SHA384', 'sha', 'sha224', 'RIPEMD160', 'shake_128', 'sha3_512', 'SHA', 'MD5', 'shake_256', 'DSA', 'sha3_384', 'DSA-SHA', 'ecdsa-with-SHA1', 'md5', 'SHA1', 'dsaWithSHA', 'md4', 'MD4', 'sha3_224'}

2. hash.update(arg)

传入arg对象来更新hash的对象。必须注意的是,该方法只接受byte类型,否则会报错。这就是要在参数前添加b 来转换类型的原因:

>>> m = hashlib.md5()
>>> m.update('123456')
TypeError: Unicode-objects must be encoded before hashing

同时要注意,重复调用update(arg)方法,是会将传入的arg参数进行拼接,而不是覆盖。必须注意这一点,因为你在不熟悉update()原理的时候,你很可能就会被它坑了。

也就是说,m.update(a); m.update(b) 等价于m.update(a+b),看下面例子:

>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
>>> m.update(b'456')
>>> m.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

>>> hashlib.md5(b'123456').hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

3. hash.hexdigest()

都知道,在英语中hex有十六进制的意思,因此该方法是将hash中的数据转换成数据,其中只包含十六进制的数字。另外还有hash.digest()方法。

以上这篇python3中的md5加密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
python调用百度REST API实现语音识别
Aug 30 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
pandas中的series数据类型详解
Jul 06 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
详解Python中import机制
Sep 11 Python
python 获取字符串MD5值方法
May 29 #Python
Python生成短uuid的方法实例详解
May 29 #Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 #Python
Python实现的多进程和多线程功能示例
May 29 #Python
Python实现的redis分布式锁功能示例
May 29 #Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 #Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 #Python
You might like
smarty实例教程
2006/11/19 PHP
php中常用编辑器推荐
2007/01/02 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
php截取字符串函数分享
2015/02/02 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python中的yield浅析
2014/06/16 Python
Python 字典dict使用介绍
2014/11/30 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
Django中多种重定向方法使用详解
2019/07/17 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Django中的AutoField字段使用
2020/05/18 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
培训专员岗位职责
2014/02/26 职场文书
《王二小》教学反思
2014/02/27 职场文书
企业委托书范本
2014/09/13 职场文书
庆七一宣传标语
2014/10/08 职场文书
公司会议开幕词
2015/01/29 职场文书
2015年助残日活动总结
2015/03/27 职场文书