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 相关文章推荐
Django视图和URL配置详解
Jan 31 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Python 修改列表中的元素方法
Jun 26 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
python定位xpath 节点位置的方法
Aug 27 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 Python
如何使用Cython对python代码进行加密
Jul 08 Python
python3 kubernetes api的使用示例
Jan 12 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
source.php查看源文件
2006/12/09 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
竞选村长演讲稿
2014/04/28 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
java中如何截取字符串最后一位
2022/07/07 Java/Android