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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
理解Python垃圾回收机制
Feb 12 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
感知器基础原理及python实现过程详解
Sep 30 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
使用keras根据层名称来初始化网络
May 21 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
python如何安装下载后的模块
Jul 03 Python
Python之多进程与多线程的使用
Feb 23 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
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python标准库与第三方库详解
2014/07/22 Python
window下eclipse安装python插件教程
2017/04/24 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Django rest framework实现分页的示例
2018/05/24 Python
Python 修改列表中的元素方法
2018/06/26 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python tkinter组件使用详解
2019/09/16 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
新学期国旗下演讲稿
2014/05/08 职场文书
解除财产保全担保书
2014/05/20 职场文书
员工手册董事长致辞
2015/07/29 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书