← 返回首页
Python3基础教程(五十九)
发表时间:2022-04-24 10:51:50
hashlib

Python内置的hashlib模块为我们提供了多种安全方便的摘要方法。

1.hash

Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。

hash值的三大特性: - 只要传入的内容一样,得到的hash值必然一样。 - 不能由hash值返解成内容。 - 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的。

2.hashlib模块 hashlib模块支持md5(),sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(),blake2s(),sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()等多种hash构造方法。

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

MD5算法具有以下特点:

实例:

# -*- coding: utf-8 -*-
# @Time : 2022/4/25 22:23
# @File : hashlibdemo.py
# @Software : PyCharm

import hashlib

md5 = hashlib.md5()

#注意update()方法现在只接受bytes类型的数据,不接收str类型。
md5.update('you fellow has seed,I will give you some color to see see!'.encode('utf-8'))
print(md5.hexdigest())

#md5摘要长度固定
md5.update('hello world!'.encode('utf-8'))
print(md5.hexdigest())

#改动一个字符试试
md5.update('You fellow has seed,I will give you some color to see see!'.encode('utf-8'))
print(md5.hexdigest())

运行结果:

4b3aa994e57f95317b5d658ed73ae1fb
f975228838c4d2f83923b317eaaefe75
a467902623c4b319996c25107ef61fc7

注意: ==MD5值在不同的操作系统以及不同电脑上生成的值都不一样。==

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

实例:

# -*- coding: utf-8 -*-
# @Time : 2022/4/25 22:23
# @File : hashlibdemo.py
# @Software : PyCharm

import hashlib

string='我命由我不由天'

sha256 = hashlib.sha256()
sha256.update(string.encode('utf-8'))

res = sha256.hexdigest()
print("sha256加密结果:",res)

运行结果:

sha256加密结果: bc42a02d8d8e7292757e2fba74e88b028b80af685d5534cd06a83a4e4555f642

3.使用场景

那么消息摘要有什么用呢?最常用的就是密码加密!密码加密不像数据加密,通常不需要反向解析出明文。而数据加密一般是需要反向解析的,我们无法从摘要反向解析出数据,加密是没问题了,但你让数据使用者如何获取数据?

当用户登录时,首先计算用户输入的明文口令的摘要值,然后和数据库存储的摘要值进行对比。如果两者一致,说明口令输入正确,如果不一致,口令肯定错误。这样,不但数据库不用储存明文密码,即使能访问数据库的管理员盗取用户密码。

那么采用诸如MD5等消息摘要存储口令是否就一定安全呢?也不一定!假设你是一个黑客,已经拿到了存储MD5口令的数据库,如何通过MD5反推用户的明文口令呢?采用暴力破解!很多用户喜欢用123456,abcdef,loveyou这些简单的口令,由于MD5、SHA1等所有摘要算法都是公开的,黑客可以事先通过这些算法计算出这些常用口令的摘要值,得到一个反推表:

08b9239f92786f609443b669d5a041c1  :  123456
960d15c50def228e8557d68945b5f7c0  :  abcdef
47c0e829611b55cd05c680859adb8863  :  loveyou

然后,无需暴力破解,只需要对比数据库的密码摘要,黑客就可以获得使用常用口令的用户账号。

加盐:额外给原始数据添加一点自定义的数据,使得生成的消息摘要不同于普通方式计算的摘要。

比如我下面给密码字符串“password”加上字符串“salt”,这里的“salt”字符串就是所谓的盐,其摘要值必然不等于正常摘要“password”字符串的值。当然这个“salt”具体是什么,完全可以自定义,而且不能告诉他人!千万不要以为加盐就是加个“salt”字符串。