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实现SMTP发送邮件详细教程
Mar 02 Python
Python3 模块、包调用&路径详解
Oct 25 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
python2.7到3.x迁移指南
Feb 01 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
简单介绍django提供的加密算法
Dec 18 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 Python
Python中for后接else的语法使用
May 18 Python
Python 循环读取数据内存不足的解决方案
May 25 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
生成静态页面的PHP类
2006/11/25 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP CURL使用详解
2019/03/21 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
详解VUE中v-bind的基本用法
2017/07/13 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
python实现逐个读取txt字符并修改
2018/12/24 Python
利用Python检测URL状态
2019/07/31 Python
pandas数据处理进阶详解
2019/10/11 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
Python LMDB库的使用示例
2021/02/14 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
数控技术专业推荐信
2013/11/01 职场文书
企业后勤岗位职责
2014/02/28 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
2015年暑期见闻
2015/07/14 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
python实现A*寻路算法
2021/06/13 Python