python3中的md5加密实例
在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加密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
- 并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
- 【DeveMobile实例】d3.js 与Trianglify 制作SVG格式Low-Poly 特效
- 未来人工智能将把人类分为3层,而你会在哪一层呢?
- IIS 7.0探索用于 Windows Vista 的 Web 服务器和更多内容
- 初学Python 之抓取当当网图书页面目录并保存到txt文件
- JavaScript 基础(二)数组
- 限制扫码付款额度,支付宝和微信要被“祭旗”?
- 拖动条SeekBar及星级评分条
- 【DeveMobile实例】利用Mobile Detect 制作单独移动端页面项目
- 互联网+智能物流高峰论坛举行运的易现场签约完成战略布局
- Quartz.net通过配置文件来完成作业调度
- JavaScript 基础(一)
- 我也来说说.net开源
- 是时候对员工进行网络安全培训了:黑客正将目标瞄准打印机
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 简单实现Android刮刮卡效果
- CentOS7.4下 安装JDK1.8的图文教程
- Android Studio中导入JNI生成的.so库的实现方法
- Android实现文件上传和下载倒计时功能的圆形进度条
- 使用Apache ab进行http性能测试
- Android Imageloader的配置的实现代码
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例
- Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能
- 猿实战21——商品发布之商品数据存储
- Android编程自定义进度条颜色的方法详解
- Android TextView对齐的两种方法
- Android ScrollView实现反弹效果的实例
- Ubuntu 18.04上安装 phpMyAdmin的详细教程
- Android Popupwindow弹出窗口的简单使用方法