Python中的hashlib模块解析

 更新时间:2023年09月22日 09:48:29   作者:XWenXiang  
这篇文章主要介绍了Python中的hashlib模块解析,hashlib是一个提供字符加密功能的模块,包含MD5和SHA的加密算法,具体支持md5,sha1, sha224, sha256, sha384, sha512等算法, 该模块在用户登录认证方面应用广泛,对文本加密也很常见,需要的朋友可以参考下

模块简介

1. 这个模块针对许多不同的安全哈希和消息摘要算法实现了一个通用接口。

2. 什么是哈希(Hash)? 哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,简单的说就是通过函数,将明文数据通过变成密文数据达到加密的作用。

3. 每种类型的 hash 都有一个构造器方法,它们都返回一个具有相同的简单接口的 hash 对象。 例如,使用sha256() 创建一个 SHA-256 hash 对象。

4. 然后使用 update() 方法向这个对象输入' 字节类对象 (通常是 bytes) '。在任何时候你都可以使用digest() 或 hexdigest() 方法获得到目前为止输入这个对象的拼接数据的 digest。

hashilib 构造器

此模块中常见 hash 算法构造器

sha1(), sha224(), sha256(), sha384(), sha512(), blake2b() 和 blake2s()。 md5()

在大部分平台上可用的还有

sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256() 等等

如果需要获取构造器对象,我们可以直接引入模块 hashilib 后用点的方式生成,如下实例:

代码示例

        import hashlib
        h = hashlib.md5()
        print(h)

打印结果

<md5 _hashlib.HASH object @ 0x00000233D317EAD0>

示例以 md5 为例,在模块名后用点的方式找到需要的算法构造器名称即可生成算法构造器对象。

hashlib.new() —创建对象

一个接受所希望的算法对应的字符串 name 作为第一个形参的通用构造器。

在 new() 括号中输入哈希构造器算法构造器的名称字符串相当于调用了构造器创建了一个对象。 此方法和上面写的用点的方式生成构造器对象结果是一样的。

语法格式

hashlib.new(name, [data, ]*, usedforsecurity=True)

代码示例

import hashlib		
		h = hashlib.new('md5')
		print(h)

打印结果

<md5 _hashlib.HASH object @ 0x0000025FC95EEAD0>

hash.digest_size

以字节表示的结果哈希对象的大小。

代码示例

import hashlib
		h = hashlib.md5()
		res1 = h.digest_size
		print(res1)

打印结果

16

返回该构造器的进制大小,md5 为16进制。

hash.block_size

以字节表示的哈希算法的内部块大小。

代码示例

import hashlib
		h = hashlib.md5()
		res1 = h.block_size
		print(res1)

打印结果

64

hash.update() —传入参数

用 byte类型 来更新哈希对象。

代码示例一

import hashlib
		h = hashlib.md5()
		h.update(b'abcdefg')  # 将字节型对象传入哈希对象
		res = h.hexdigest()
		print(res)

打印结果

7ac66c0f148de9519b8bd264312c4d64

1. 调用 md5() 生成哈希对象,使用方法 update 输入需要被加密的对象,需要注意必须为'字节型数据',

2. 如何获得字节型对象?可以使用字符串的内置方法 encode() 转化为字节型。或者,当字符串为英文或者纯数字组成,只要在字符串引号外加上' b '也可以转化成字节型。

重复调用相当于单次调用并传入所有参数的拼接结果: m.update(a); m.update(b) 等价于 m.update(a+b)

代码示例二

import hashlib
		h = hashlib.md5()
		h.update(b'abcd')  # 传一次 b'abcd' 再传一次 b'efg' 结果和传一次 b'abcdefg'一样
		h.update(b'efg')
		res = h.hexdigest()
		print(res)

打印结果

7ac66c0f148de9519b8bd264312c4d64

结果和示例一中的值一样。

hash.digest() —返回字节串对象

返回当前已传给 update() 方法的数据摘要。 这是一个大小为 digest_size 的字节串对象。

也就是说返回被加密后的字节串对象。

代码示例

import hashlib
		h = hashlib.md5()
		h.update(b'abcdefg')
		res = h.digest()
		print(res)

打印结果

b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'

hash.hexdigest() —返回字符串对象

类似于 digest() 但摘要会以两倍长度字符串对象的形式返回,其中仅包含十六进制数码。 这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值。

代码示例

    import hashlib
		h = hashlib.md5()
		h.update(b'abcdefg')
		res = h.hexdigest()
		print(res)

打印结果

7ac66c0f148de9519b8bd264312c4d64

加密补充

数据被加密后是不能被直接解密的,网站上的解密一般都是暴力解密,不断地在猜在试有可能得出结果。

加盐处理

我们还可以通过加盐操作来提高破解数据的难度,加盐其实就是在真正要被加密的数据中添加其他数据。

代码示例

import hashlib
		h = hashlib.md5()
		h.update('你好帅'.encode('utf8'))  # 假设为真实数据
		h.update(b'asgxfajchdvb')  # 随便打的数据
		res = h.hexdigest()
		print(res)

打印结果

ef77c21d860c3ccf4aed6e52720c8e42

因为 update 调用多次和调用一次的结果相同,我们可以把真假数据分开。

如果把假数据删除,结果是: 195eaff9c88bceae9f094f5ef322e5da所以实现了对加密程度的升级。

动态加盐

我们可以不将假数据写死,可以通过变量实现动态加盐,变量值可以是时间、用户名的部分...

代码示例

import hashlib
		x = 'asgxfajchdvb'
		h = hashlib.md5()
		h.update('你好帅'.encode('utf8'))
		h.update(x.encode('utf8'))
		res = h.hexdigest()
		print(res)

打印结果

ef77c21d860c3ccf4aed6e52720c8e42

和写死的结果一样。

加密应用场景

1. 密码加密如何比对

用户输入是明文但是到了程序里面之后会采用相同的加密算法变成密文,之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误

2. 文件内容一致性校验

作为软件的提供者,提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文,用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致,如果相同表示中途没有被修改,如果不是表示中途被修改过,可能存在病毒

3. 针对大文件一致性校验的优化策略

如果一个文件很大,那么如果全部读取并加密速度太慢,这个时候可以考虑对文件内容进行切片读取并加密的操作

到此这篇关于Python中的hashlib模块解析的文章就介绍到这了,更多相关Python的hashlib模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python控制台中实现进度条功能

    python控制台中实现进度条功能

    这篇文章主要介绍了python控制台中实现进度条功能的方法,想要了解的朋友可以参考一下
    2015-11-11
  • Python密码学Caesar Cipher凯撒密码算法教程

    Python密码学Caesar Cipher凯撒密码算法教程

    这篇文章主要为大家介绍了Python密码学Caesar Cipher凯撒密码算法教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python标准库json模块和pickle模块使用详解

    Python标准库json模块和pickle模块使用详解

    这篇文章主要介绍了Python标准库json模块和pickle模块使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python利用wxPython制作股票价格查询工具

    Python利用wxPython制作股票价格查询工具

    在当今信息时代,金融市场是一个引人注目的话题。本文将介绍如何使用 Yahoo Finance API、yfinance 模块和 wxPython 库来创建一个简单的全球股市实时价格查询工具,希望大家能够喜欢
    2023-05-05
  • python模型集成知识点总结

    python模型集成知识点总结

    在本篇文章里小编给大家整理了一篇关于python模型集成知识点总结,有需要的朋友们可以学习参考下。
    2021-08-08
  • pandas将Series转成DataFrame的实现

    pandas将Series转成DataFrame的实现

    本文主要介绍了pandas将Series转成DataFrame的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Python学习之字典和集合的使用详解

    Python学习之字典和集合的使用详解

    Python 中字典和集合也是非常相近的概念,而且从外观看上去,也有那么一丝丝的相似。本文将从字典基本知识入手,为你展开字典类型数据的各个知识点,需要的可以参考一下
    2022-11-11
  • Python中字符串的处理技巧分享

    Python中字符串的处理技巧分享

    这篇文章给大家分享了Python中字符串的处理技巧,包括拆分含有多种分隔符的字符串、判断字符串a是否以字符串b开头或结尾、调整字符串中文本的格式已经将多个小字符串拼接成一个大的字符串等,感兴趣的朋友们可以通过阅读下文来学习。
    2016-09-09
  • Python对象与json数据的转换问题实例详解

    Python对象与json数据的转换问题实例详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,很受广大用户喜爱,今天通过本文给大家介绍Python对象与json数据的转换问题,需要的朋友可以参考下
    2022-07-07
  • python使用__slots__让你的代码更加节省内存

    python使用__slots__让你的代码更加节省内存

    如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的slots来实现。这篇文章主要给大家介绍了关于python如何使用__slots__让你的代码更加节省内存的相关资料,需要的朋友可以参考下
    2018-09-09

最新评论