Python基础之hashlib模块详解


Posted in Python onMay 06, 2021

一、hashlib简介

1.什么叫hash:

hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值

2.hash值的特点是(hash值/产品有三大特性:):

  • 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
  • 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码(只能有内容返回hash值)
  • 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的(如从网上下载文件要进行hash校验,保证网络传输没有丢包)

MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长

二、hash对象的方法

hash.update(arg)
更新hash对象。连续的调用该方法相当于连续的追加更新。例如m.update(a); m.update(b)相当于m.update(a+b)。注意,当数据规模较大的时候,Python的GIL在此时会解锁,用于提高计算速度。
一定要理解update()的作用,由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()的值都会不一样。
 
hash.digest()
返回bytes格式的消息摘要
 
hash.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。通常用于邮件传输或非二进制环境中。通常我们比较摘要时,比较的就是这个值!
 
hash.copy()
返回一个hash对象的拷贝

hashlib.new(name[, data])
一个通用的构造方法,name是某个算法的字符串名称,data是可选的bytes类型待摘要的数据。

>>> h = hashlib.new('sha256',b"haha")
>>> h.hexdigest()
'090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1'

三、hashlib实际操作

1)在进行md5哈希运算前,需要对数据进行编码,否则报错

import hashlib
obj = hashlib.md5()   #构造一个hashlib的对象
obj.update("小马过河")  #update对指定字符串进行加密
print(obj)           
--------------结果:
  obj.update("小马过河")
TypeError: Unicode-objects must be encoded before hashing

2)obj是hash对象

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
print(obj,type(obj))
-------------------结果:
<md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>

3)得到字符串

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
result=obj.hexdigest()
print(result)
--------------结果:
24f67b0f6d02adc8867d612e0e0fc40a

4)给加密增添难度

import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8"))  #添加一些内容,提高加密复杂度。此处的字符串也要先编码,
obj.update("小马过河".encode('utf-8'))
result = obj.hexdigest()
print(result)
-------------------结果:
b11740508f28e04837f2c0e3a58cf990

5)用hashlib做成加密函数(添加基础的字符了的)

import hashlib
def get_md5(data):   #传参为需要加密的字符串
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()          
    return result
val = get_md5('123')
print(val)
--------------结果:
35093270b6352fa9721370b781f7b4d7

四、小小案例

import hashlib
USER_LIST = []
def get_md5(data):
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
def register():
    print('**************用户注册**************')
    while True:
        user = input('请输入用户名:')
        if user == 'N':
            return
        pwd = input('请输入密码:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)
def login():
    print('**************用户登陆**************')
    user = input('请输入用户名:')
    pwd = input('请输入密码:')

    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True
register()
result = login()
if result:
    print('登陆成功')
else:
    print('登陆失败')
------------------------结果:
**************用户注册**************
请输入用户名:小马过河
请输入密码:123456
请输入用户名:N
**************用户登陆**************
请输入用户名:小马过河
请输入密码:123456
登陆成功

到此这篇关于Python基础之hashlib模块详解的文章就介绍到这了,更多相关Python hashlib模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python新手实现2048小游戏
Mar 31 Python
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
Python yield 使用浅析
May 28 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python列表删除的三种方法代码分享
Oct 31 Python
python绘制直方图和密度图的实例
Jul 08 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
Python pip安装模块提示错误解决方案
May 22 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
python 字典和列表嵌套用法详解
Jun 29 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
PHP文件下载类
2006/12/06 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
python 算法 排序实现快速排序
2012/06/05 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
Python实现将xml导入至excel
2015/11/20 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Python流程控制常用工具详解
2020/02/24 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
体育运动口号
2014/06/09 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
党员评议个人总结
2014/10/20 职场文书
现实表现证明材料
2015/06/19 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
关于vue-router-link选择样式设置
2022/04/30 Vue.js