当前位置: 首页 > news >正文

Python常用内建模块——hashlib

哈希早在大一下学python课程就有所领略,当时被动的接收让我觉得挺难的。但今天静下来学了廖老师的课程之后发现并不难,甚至可以说非常公式化。

首先,hashlib模块实现了多种安全哈希算法的通用接口,包括 MD5、SHA 系列(SHA1、SHA224、SHA256、SHA384、SHA512)、SHA3 系列以及 BLAKE2,而我们常用的一般就是MD5,以及SHA1。

其主要特点包括:

1.算法统一接口​​:所有哈希算法对象都共享相同的方法(如 update()digest(),      hexdigest()),调用方式标准化。

2.不可逆性​​:哈希值无法还原出原始数据,常用于加密验证。

​3.确定性​​:相同输入总是产生相同的哈希值。

4.​​内存优化​​:支持分块处理大文件,避免内存溢出。

我们以常见的哈希算法MD5为例,计算出一个字符串的MD5值:

另一种常见的哈希算法是SHA1,调用SHA1和调用MD5完全类似:

哈希算法在用户密码的安全性上有着广泛的应用:

任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

namepassword
michael123456
bobabc999
alicealice2008

如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的哈希,比如MD5:

usernamepassword
michaele10adc3949ba59abbe56e057f20f883e
bob878ef96e86145580c38c87f0410ad153
alice99b1c2188db85afee403b1536010c2c9

当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。

练习一

根据用户输入的口令,计算出存储在数据库中的MD5口令:

def calc_md5(password):pass

存储MD5的好处是即使运维人员能访问数据库,也无法获知用户的明文口令。

设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:

db = {'michael': 'e10adc3949ba59abbe56e057f20f883e','bob': '878ef96e86145580c38c87f0410ad153','alice': '99b1c2188db85afee403b1536010c2c9'
}def login(user, password):pass# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

 

练习二

根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5:

db = {}def register(username, password):db[username] = get_md5(password + username + 'the-Salt')

然后,根据修改后的MD5算法实现用户登录的验证:

import hashlib, randomclass User(object):def __init__(self, username, password):self.username = usernameself.salt = ''.join([chr(random.randint(48, 122)) for i in range(20)])self.password = get_md5(password + self.salt)db = {'michael': User('michael', '123456'),'bob': User('bob', 'abc999'),'alice': User('alice', 'alice2008')
}def get_md5(user, pws):return ???def login(username, password):user = db[username]return user.password == get_md5(user, password)# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

对于第二题的解释

实现功能:

1. 1.
用户注册系统 :使用固定salt ('the-Salt') 增强密码安全性
2. 2.
用户登录验证系统 :使用随机salt为每个用户生成独特的密码哈希
核心实现:

- get_md5(s) 函数:将输入字符串转换为字节串,计算并返回MD5哈希值的十六进制表示
- register(username, password) 函数:使用固定salt计算密码哈希并存储
- User 类:为每个用户生成随机salt并计算密码哈希
- login(username, password) 函数:验证用户凭据,使用对应用户的salt重新计算密码哈希并比较
安全特性:

- 使用随机salt为每个用户生成不同的密码哈希,即使相同密码也会产生不同的哈希值
- 结合用户名和salt进一步增强密码安全性
- 存储哈希值而非明文密码

http://www.dtcms.com/a/407138.html

相关文章:

  • 《C++程序设计》笔记p7
  • 住房城乡建设网站查询wordpress 标签选项卡
  • 服务器机械硬盘能支撑高并发流媒体吗?
  • 奇妙数字(GESP五级202412T1)C++题解
  • 网站建设需要多少技术有备案号的网站是公司的吗
  • vscode壁纸插件(无主题修改)
  • OpenLayers地图交互 -- 章节十一:拖拽文件交互详解
  • 做网站优化的协议书免费网页制作的网站
  • 吃的网站要怎么做的企业管理咨询与诊断实践报告
  • Mac系统,Docker的MySQL + 本地 Canal
  • 零基础学Docker(3)--图形化管理工具Portainer
  • 远控中,游戏与应用中心功能如何开启?适用于哪些场景?
  • 零基础学Docker(4)--Docker镜像原理
  • 商丘网站制作报价信赖赛憬科技手机设计软件哪个好
  • R语言 生物分析中 富集分析的可视化,特别是气泡图和条形图的作用和解读
  • 上海市虹口市容建设公司网站文件外链生成网站
  • 利用h5做网站的心得学校网站建设意义有哪些方面
  • 美食网站建设多少钱wordpress又拍云cdn伪静态
  • 吴恩达d1
  • 第26讲 无监督机器学习
  • 【机器学习】我如何解释线性回归(欢迎指正讨论)
  • 申请的网站怎么建设广告公司加盟代理哪家好
  • STM32F4+RT-Thread IWDG 看门狗 开发实战:从驱动编写到“喂狗、超时复位”指南
  • 视频网站后台模板电影网站html代码
  • 从“黄金公式“到AI内容矩阵:快消品牌如何实现转化率8倍增长
  • Magick.NET库测试
  • 八、OpenCV中的常见滤波方式
  • ReAct与PlanReAct的定义及区别
  • 网站 廉政建设 板块中装建设官网
  • 63.[前端开发-Vue3]Day05-非父子通信-声明周期-refs-混合-额外补充