热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3中的md5加密实例

今天小编就为大家分享一篇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加密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • 动态多点××× 单云双HUB
    动态多点是一个高扩展的IPSEC解决方案传统的ipsecS2S有如下劣势1.中心站点配置量大,无论是采用经典ipsec***还是采用greoveripsec多一个分支 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
author-avatar
帅哥刘常胜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有