Python hashlib模块详细讲解使用方法
作者:Python热爱者 发布时间:2021-09-11 12:08:16
1.hashlib的简介
hashlib 是一个提供了一些流行的hash(摘要)算法的Python标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。更多请看:hashlib — 安全哈希与消息摘要
2.hashlib的使用
本文以hashlib中MD5算法为例,其他的sha224、sha256算法用法和MD5基本一致。
1. 常用属性
hashlib.algorithms
#列出所有加密算法
h.digest_size
#产生的散列字节大小。
h.block_size
#哈希内部块的大小
2. 常用方法
hash.new([arg])
# 创建指定加密模式的hash对象
hash.update(arg)
# 更新哈希对象以字符串参数。如果同一个hash对象重复调用该方法,m.update(a); m.update(b) 等价于 m.update(a+b)
hash.digest()
# 返回摘要,作为二进制数据字符串值。
hash.hexdigest()
# 返回摘要,作为十六进制数据字符串值
hash.copy()
# 复制
3. 使用示例
# MD5 的使用
#其它的sha1,sha256就是加密函数不一样,其余基本相同,这里就不演示了
import hashlib
def jm_md5(password):
m = hashlib.md5() # 构建MD5对象
m.update(password.encode(encoding='utf-8')) #设置编码格式 并将字符串添加到MD5对象中
password_md5 = m.hexdigest() # hexdigest()将加密字符串 生成十六进制数据字符串值
return password, password_md5
g = jm_md5('123456')
print(g)
#结果输出:
('123456', 'e10adc3949ba59abbe56e057f20f883e')
3.hashlib的特点
摘要算法在很多地方都有广泛的应用。
要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。
它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
一个优秀的 hash 算法,将能实现:
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
4.实际演示
1. 基本演示
import hashlib
# 一、在构建对象直接插入加密字符串
m1 = hashlib.md5('hello python'.encode(encoding='utf-8')) # 构建MD5对象
print(m1.hexdigest()) # 结果为: e53024684c9be1dd3f6114ecc8bbdddc
# 二、通过update方法 往MD5对象中增加字符串参数
m2 = hashlib.md5() # 构建MD5对象
m2.update('hello python'.encode(encoding='utf-8')) # 设置编码格式 并将字符串添加到MD5对象中
password_md5 = m2.hexdigest()
print(m2.hexdigest()) # 结果为 e53024684c9be1dd3f6114ecc8bbdddc
# 三、当数据量过过大时,可以分块摘要,例如:
m3 = hashlib.md5()
m3.update("hello ".encode("utf-8")) # 注意:分块是空格也要保持一致
m3.update("python".encode("utf-8"))
print(m3.hexdigest()) # 结果为:e53024684c9be1dd3f6114ecc8bbdddc
# MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
三种方式,往构造的MD5对象中传参,只要传参的字符串一致,最后生成的结果是一样的。
这说明hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值。这也是摘要算法的一个特点,它不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。
2. 应用场景案例
hashlib模块主要应用于,用户账号密码登录,对明文密码进行加密等
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import hashlib
USER_LIST = []
def pwd_Md5(password):
password = password+'hello python' # 字符串混淆加盐,可以设置更复杂一点
return hashlib.md5(password.encode("utf-8")).hexdigest()
def register():
print('**************用户注册**************')
while True:
user = input('请输入用户名:')
if user.isalpha():
break
while True:
password1 = input('请输入密码>>>:').strip()
passwprd2 = input('请重复密码>>>:').strip()
if password1 == passwprd2:
password = pwd_Md5(password1) # 将密码进行Md5加密
break
else:
print('密码不正确,重新输入!')
temp = {'username':user,'password':password}
USER_LIST.append(temp)
def login():
print('**************用户登陆**************')
user = input('请输入用户名:')
pwd = input('请输入密码:')
for item in USER_LIST:
if item['username'] == user and item['password'] == pwd_Md5(pwd):
return True
if __name__=='__main__':
register()
if login():
print('登陆成功')
else:
print('登陆失败')
#结果输出:
**************用户注册**************
请输入用户名:lizexiong
请输入密码>>>:123456
请重复密码>>>:123456
**************用户登陆**************
请输入用户名:lizexiong
请输入密码:123456
登陆成功
用户登录需要使用密码,密码一定要加密,保证用户的信息安全。
加密可以使用hashlib模块进行加密。
加密可以写成加密函数,方便多处调用
提高密码解密的复杂性,代码中多加字符串。(加密算法虽然依然非常厉害,但是也存在缺陷,即:通过撞库可以反解。所以,有必要对加密密码进行加盐。)
来源:https://blog.csdn.net/qdPython/article/details/127690372
猜你喜欢
- 本文实例讲述了python使用协程实现并发操作的方法。分享给大家供大家参考,具体如下:协程协程是一种用户态的轻量级线程,又称微线程。协程拥有
- 在XHTML标签中有一些标签的作用是相似的,当然这里的相似是指语义相似,以至于很多人都不清楚这些相似的标签如何使用,那么今天的主题就是分解相
- Howdy, 大家好,又是我~ 上一次我们简单的谈了一下font set和一些要注意的基本问题。今天我们继续字体这一话题,深入讲讲上次提到
- 呵呵,我之前也写过一个类似的模板替换功能.>> 已实现:>、<、>=、<=、=、==等简单的运算>
- 在TypeScript 项目中,我们经常需要使用声明一系列的ts类型。然而,手动写的效率实在太低,编写一个自动生成ts类型的工具可以解放生产
- 在SQL Server中,为了查询性能的优化,有时我们就需要对数据表通过建立索引的方式,目的主要是根据查询要求,迅速缩小查询范围,避免全表扫
- 1、从数据库表中检索信息实际上,前面我们已经用到了SELECT语句,它用来从数据库表中检索信息。select语句格式一般为:SELECT 检
- 当服务器必须提供与两个或更多个网络或网络子网的连接时,典型的方案是使用多宿主计算机。此计算机通常位于外围网络(也称为 DMZ、外围安全区域或
- LRULRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访
- 自己写的小工具,可以直接获取csdn文章并转换为markdown格式效果图核心代码from PySide2.QtWidgets import
- 在静态页面里需要显示浏览次数的地方加上这个:浏览次数:<SCRIPT language='javascript
- 在MySQL中有两种方法1、create table t_name select ...2、create table t_name like
- 目的:把question_id 对应的user_answer转成ABCDsolutiondfa=df.groupby('questi
- import timeimport paramikoclass HandleParamiko: '''
- 一.下载安装包官网下载:python 3.6.0打开链接滑到页面最下方二. 开始安装1.双击下载好的安装文件python-3.6.0-amd
- 前面简单介绍了Python列表基本操作,这里再来简单讲述一下Python元组相关操作>>> dir(tuple) #查看元
- 用于序列化的两个模块json:用于字符串和Python数据类型间进行转换pickle: 用于python特有的类型和python的数据类型间
- 本文实例讲述了Python去除列表中重复元素的方法。分享给大家供大家参考。具体如下:比较容易记忆的是用内置的setl1 = ['b&
- button元素在过去一直没有被重视,其实它比<input type="button">的语义强许多,制定性
- 根据Nicholas的说法,有四种代码会拖慢脚本的运行,并最终导致脚本失控。分别是次数过多的同步循环、庞大的函数体、不恰当的递归和不合理的D