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读取表格类型文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python中docx2txt库的使用说明

    Python中docx2txt库的使用说明

    这篇文章主要介绍了Python中docx2txt库的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 使用python获取电脑的磁盘信息方法

    使用python获取电脑的磁盘信息方法

    今天小编就为大家分享一篇使用python获取电脑的磁盘信息方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python列表推导式入门学习解析

    python列表推导式入门学习解析

    这篇文章主要介绍了python列表推导式入门学习解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Pygame Event事件模块的详细示例

    Pygame Event事件模块的详细示例

    事件是Pygame的重要模块之一,比如鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等等,本文就详细的介绍一下具体用法,感兴趣的可以了解一下
    2021-11-11
  • python中pandas对多列进行分组统计的实现

    python中pandas对多列进行分组统计的实现

    分组统计在很多时候都需要用到,可以实现很多数据库函数的功能。本文主要介绍了python中pandas对多列进行分组统计的实现,感兴趣的可以了解一下
    2021-06-06
  • 使用python将图片按标签分入不同文件夹的方法

    使用python将图片按标签分入不同文件夹的方法

    今天小编就为大家分享一篇使用python将图片按标签分入不同文件夹的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python是什么 Python的用处

    Python是什么 Python的用处

    在本篇文章里小编给大家分享的是关于python的作用和用途知识点,有兴趣的朋友们可以参考下。
    2020-05-05
  • 在python中用url_for构造URL的方法

    在python中用url_for构造URL的方法

    今天小编就为大家分享一篇在python中用url_for构造URL的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python处理emoji表情(两个函数解决两者之间的联系)

    python处理emoji表情(两个函数解决两者之间的联系)

    这篇文章主要介绍了python处理emoji表情,主要通过两个函数解决两者之间的联系,本文通过实例代码给大家介绍的非常完美,对python emoji表情的相关知识感兴趣的朋友一起看看吧
    2021-05-05

最新评论