python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python的hashlib模块

Python中的hashlib模块解析

作者: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模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文