文章目录

  • 一、hashlib的简介
  • 二、hashlib的使用
    • 1、常用属性
    • 2、常用方法
    • 3、使用示例
  • 三、hashlib的特点
  • 四、代码实操
    • 1、举例子
    • 2、应用场景案例

一、hashlib的简介

hashlib 是一个提供了一些流行的hash(摘要)算法的Python标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。更多请看:hashlib — 安全哈希与消息摘要

二、hashlib的使用

本文以hashlib中MD5算法为例,其他的sha224、sha256算法用法和MD5基本一致。如果想看其他案例可以参考我的博文:用python实现MD5、sha256、sha384、sha512、base64加密

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 的使用
import hashlibdef jm_md5(password):m = hashlib.md5()  # 构建MD5对象m.update(password.encode(encoding='utf-8')) #设置编码格式 并将字符串添加到MD5对象中password_md5 = m.hexdigest()  # hexdigest()将加密字符串 生成十六进制数据字符串值return password, password_md5g = jm_md5('123456')
print(g)

三、hashlib的特点

1、摘要算法在很多地方都有广泛的应用。
2、要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。
3、它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

一个优秀的 hash 算法,将能实现:
参考博客

正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

四、代码实操

可以看看我其他篇博文:用python实现MD5、sha256、sha384、sha512、base64加密

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模块主要应用于,用户账号密码登录,对明文密码进行加密等

import hashlibUSER_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():breakwhile True:password1 = input('请输入密码>>>:').strip()passwprd2 = input('请重复密码>>>:').strip()if password1 == passwprd2:password = pwd_Md5(password1)  # 将密码进行Md5加密breakelse: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 Trueif __name__=='__main__':register()if login():print('登陆成功')else:print('登陆失败')结果:
**************用户注册**************
请输入用户名:wuhan
请输入密码:123456
**************用户登陆**************
请输入用户名:小马过河
请输入密码:123456
登陆成功

代码分析:
1、用户登录需要使用密码,密码一定要加密,保证用户的信息安全。
  1)加密可以使用hashlib模块进行加密。
  2)加密可以写成加密函数,方便多处调用
  3)提高密码解密的复杂性,代码中多加字符串。(加密算法虽然依然非常厉害,但是也存在缺陷,即:通过撞库可以反解。所以,有必要对加密密码进行加盐。)

Python中hashlib模块详解相关推荐

  1. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  2. Python中time模块详解

    转载自:http://qinxuye.me/article/details-about-time-module-in-python/ 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间 ...

  3. [转载] python中pprint模块详解——print()和pprint()两者的区别

    参考链接: pprint:Python中的数据漂亮打印方法pprint pprint的英文全称Data pretty printer,顾名思义就是让显示结果更漂亮. print()和pprint()都 ...

  4. Python中time模块详解(转)

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...

  5. Python中time模块详解[转]

    http://qinxuye.me/article/details-about-time-module-in-python/ 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关 ...

  6. python中pprint模块详解——print()和pprint()两者的区别

    pprint的英文全称Data pretty printer,顾名思义就是让显示结果更漂亮. print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是pprint()模 ...

  7. python中time模块详解_Python time模块详解

    time 模块主要包含各种提供日期.时间功能的类和函数.该模块既提供了把日期.时间格式化为字符串的功能,也提供了从字符串恢复日期.时间的功能. 在 Python 的交互式解释器中先导入 time 模块 ...

  8. python中threading模块详解

    转载自       http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thread模块更高层的API来提供线程 ...

  9. python中threading模块详解及常用方法_Python常用模块功能简介(二)threading

    threading模块基本用法 threading.Thread.join函数解释 threading.Thread.join(timeout=None)调用该函数的线程会阻塞调用该线程的主线程和其它 ...

最新文章

  1. 让开发变得更简单 | 阿里云中间件推出全新开发者服务
  2. linux -L -l区别,linux ls -l 详解[转]
  3. 高级mysql优化知识_MySQL高级第三篇(索引优化分析)
  4. python代码示例百度云-python利用百度云接口实现车牌识别的示例
  5. PKI/CA (4)根CA信任模型“证书构建”
  6. 简单的docker命令ubuntu系统
  7. Android录制和播放PCM数据
  8. *如何循序渐进向DotNet架构师发展(转)
  9. android 判断服务是否正在运行,Android 判断某个服务(service)是否运行
  10. C++ stack
  11. 使用hutool发送QQ邮件在windows正常,linux发送报错。
  12. springboot 启动加载数据库数据到redis缓存
  13. 阅读《构建执法》11-12章
  14. Logo创作灵魂(下篇)
  15. MyBatis注解开发方式
  16. ad17编辑界面怎么检查未连线_EZCast投屏软件提示未发现装置,请检查网路连线状态怎么办?...
  17. Python-opencv 批量处理图片
  18. linux dpkg: 错误: 无法打开软件包的 info 文件 /var/lib/dpkg/available 以便读取: 没有那个文件或目录
  19. 阿里云ddns ipk包下载
  20. Python -- 大作业 — 使用turtle库画皮卡丘

热门文章

  1. 创新创业2020答案---【快捷查询】
  2. 外国教授在 B 站当 UP 主上课,网友直呼好家伙:滑铁卢大学《差分隐私》课程上线...
  3. oppoa92s能否刷安卓9_oppoA92s刷机教程 oppo A92s卡刷官方系统升级教程与步骤
  4. 游戏开发之大话西游II Online -- 项目文档撰写
  5. Python(我的世界)-第一讲
  6. 算法是什么,为什么需要算法
  7. 为什么淘宝直播间人气总是上不去?影响淘宝直播人气的原因
  8. CSS阴影的那些事儿
  9. mAPI软件发布升级版本v1.3.0(测试版)
  10. ipad如何分屏操作_苹果手机如何分屏操作