这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
前言
在互联网的时代,我们在网络中传输过程中都是要经过加密的,常见网络数据传输的加密方式有MD5和RSA算法。
当然,加密算法还有很多中按加密、解密方式不同分为:对称加密、非对称加密、hash加密。
其中MD5算法的基础是使用的hash算法,针对不同安全的hash安全算法,Python也提一个通用接口hashlib模块。
本期,我们来对Python 提供的安全哈希算法的通用接口-hashlib模块进行学习,Let's go ~
1. hashlib 模块概述
hashlib 是Python 内置用于对安全哈希和消息摘要的通用接口模块。hashlib 模块支持提供目前主流hash算法如MD5、SHA-1、SHA-2、SHA-256等通用构造方法,并且返回带有同样接口的hash对象。
-
hashlib 模块特点
- 提供主流的hash算法操作,替代md5模块和sha模块
- 模块调用简单,无需下载安装
- 主要应用在文本加密场景如用户登录认证
-
hashlib 模块使用步骤
- 导入hashlib库:import hashlib
- 建立加密对象
- 对字符串进行加密处理
- 获取转换成新的N个Bit
2. hashlib 工作原理
hashlib 模块中加密方式是我们常见的hash算法。hash算法又称为散列表(hash table),也叫做哈希表。
-
hash 算法特点
- 具有唯一确定性,不同字符串加密后都是不一样的
- 不可逆性,hash只有加密没有解密过程
- 散列碰撞,输出和输入值不是一一对应关系
-
hash 构造方法
-
直接定址方法
- 公式一:hash(key) = key
- 公式二:hash(key) = a*key+b
- 我们可以查看到直接定址方法具有线性的特点,因此适用在关键字分布连续的情况
-
数学分析方法
- 方式:提取关键字中随机性好的数字位,将其拼接为哈希地址
- 适用场景:关键字已知的情况下,对关键字中每一位进行取值情况分析
-
除留余数方法
- 公式:hash(key) = key % p
- 除数采用取余模运算
-
-
hash 算法过程
- hash 函数接收到输入的字符串,首先会先进行预处理-哈希计算-输入摘要
- 预处理:将字符串进行填充、分割N块,为hash进行初始化
- 哈希计算:将预处理的数据完成指定算法生成消息摘要
- 每指定一种hash算法只会生成固定长度的摘要,长度越长的安全性越高
-
hash 常用算法
-
MD5
MD5:message-Digest Algorithm 5 信息-摘要算法5,该算法用于信息完整性进行校验
-
计算方式:求余、取余、调整长度、进行链接变量循环运算求出结果
-
用途:主要用于文件校验
-
-
SHA-1
SHA:secure Hash Algorithm 安全散列算法1,是一种密码散列算法,SHA-1可以生成摘要消息为40位的16进制即160位(20字节)的散列值
- 用途:TSL、SSL、PGP、SSH等协议中广泛使用
-
3. hashlib 属性方法
hashlib 模块相关属性
| 属性 | 作用 |
|---|---|
| hashlib.algorithms_guaranteed | 保证所有平台上都支持哈希算法的名称 |
| hashlib.algorithms_available | 保证平台上运行的Python解释器上可用的hash算法的名称 |
hashlib 构造对象相关的属性
| 属性 | 作用 |
|---|---|
| hash.digest_size | 以字节表示哈希对象的大小 |
| hash.block_size | 以字节表示哈希算法的内部块大小 |
| hash.name | 哈希对象的名称 |
hashlib 模块相关方法目前可以支持主流hash算法。
| 方法 | 作用 |
|---|---|
| hashlib.pbkdf2_hmac(hash_name,password,salt,itera,dklen=None) | PKCS#5基于密码的秘钥派生函数2,作为HMAC作为伪随机函数 |
| hashlib.scrypt(password,*,salt) | 基于密码加密的秘钥派生函数 |
| hashlib.md5() | md5加密方式 |
| hashlib.sha1 | sha1加密方式 |
| hashlib.sha256 | sha256加密方式 |
| hashlib.blake2b () | blake2b加密方式 |
| hashlib.blake2s | black2s加密方式 |
hashlib 构造对象相关的方法
| 方法 | 作用 |
|---|---|
| hash.update(data) | 以字节表示哈希对象 |
| hash.digest() | 返回当前已传给update()方法的数据摘要 |
| hash.hexdigest() | 以16进制的字符串表示哈希数据值 |
| hash.copy() | 将hash对象复制,共享初始数据的摘要 |
4. 小试牛刀
我们学习hashlib模块中对字符串进行hash算法处理,我们来实操一下吧
import hashlib
text_md5 = hashlib.md5()
text_md5.update(bytes("hello juejing",encoding="utf-8"))
print("md5:",text_md5.hexdigest())
text_sha1 = hashlib.sha1()
text_sha1.update(bytes("hello juejing",encoding="utf-8"))
print("sha1:",text_sha1.hexdigest())
text_sha256 = hashlib.sha3_256()
text_sha256.update(bytes("hello juejing",encoding="utf-8"))
print("sha256:",text_sha256.hexdigest())
text_crc32 = hashlib.()
text_sha256.update(bytes("hello juejing",encoding="utf-8"))
print("sha256:",text_sha256.hexdigest())
-
💬 重要说明
- 添加自定义key与字符串进行组合加密(加盐)
- 以MD5加密为例如下
- 加盐写法一:
text_md5 = hashlib.md5(b"key") text_md5.update("字符串".encode("utf-8"))- 加盐写法二:
key = "字符串" yan = "字符串2" text_md5 = hashlib.md5() text_md5.upadte((key+yan).encode("utf-8"))
总结
本期,我们对hashlib模块中hash算法特点、hashlib模块相关支出算法的方法进行学习和实操。
在hash算法中我们常用使用md5/sha1/sha256主要用于文本校验、用户登录认证等数据校验
同时,hash算法确保数据的完整性,具有不可逆性,同时它会遭遇到暴力碰撞,因此hash长度越长的安全性也越高。
以上是本期内容,欢迎大佬们点赞评论,下期见~