Python学习笔记-使用哈希算法Hash,Hashlib进行数据加密
文章目录
- 一、概述
- 1.1 哈希算法
- 1.2 常见算法分类
- 1.2.1 SHA算法
- 1.2.2 MD4算法
- 1.2.3 MD5算法
- 1.3 Hash算法的特性
- 1.4 Hash算法的应用场景
- 1.4.1 数据校验
- 1.4.2 安全加密
- 1.4.3 数字签名
- 二、Hash算法使用
- 2.1 使用hash函数直接获取hash值
- 2.2 使用hashlib库进行hash计算
- 2.2.1 基本使用
- 2.2.2 算法的选择
- 2.2.2.1 使用构造器
- 2.2.2.2 使用new()方法
- 2.2.3 使用algorithms_guaranteed查看所有平台都支持的哈希算法名称
- 2.2.4 使用algorithms_available查看当前解释器支持的哈希算法名称
- 2.2.5 使用digest()返回哈希值
- 2.2.6 使用hexdigest()返回十六进制哈希值
- 2.2.7 使用update()函数添加数据
- 2.2.8 hash类型的其他方法
一、概述
1.1 哈希算法
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数,也叫做摘要算法。
1.2 常见算法分类
1.2.1 SHA算法
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
如SHA-1、SHA-2(包括SHA-224、SHA-256、SHA-384,和SHA-512四种)。
1.2.2 MD4算法
MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest(消息摘要) 的缩写。它适用在32位字长的处理器上用高速软件实现——它是基于 32位操作数的位操作来实现的。
1.2.3 MD5算法
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。
1.3 Hash算法的特性
一个优秀的Hash算法具有如下特点:
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干) hash值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 冲突避免:很难找到两段内容不同的明文,使得它们的 hash值一致(发生冲突)。对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
1.4 Hash算法的应用场景
1.4.1 数据校验
通过将需要传输的数据进行hash校验,然后在传输之后本地再次对数据进行hash校验,将两次数据对比,即可快速的确认数据是否一致,以及数据是否被篡改。
1.4.2 安全加密
通过hash算法,可以将明文的密码,加密成固定长度的密码串,大大加强了密码的安全防护,很难暴力破解。
1.4.3 数字签名
Hash算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对Hash值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。
二、Hash算法使用
2.1 使用hash函数直接获取hash值
python内置的hash()函数可以快速的获取到hash,不过存在不同进程或者编译过程会有差异的问题,此方法适用于同一次运行时获取制定数据所需要的内容,但不适用于快程序或者跨进程的对比。
测试代码如下:
rawdata = "我只是一个测试数据"
rawdata1 = "我只是一个测试数据 "print("Hash-rawdata : ",hex(hash(rawdata)))
print("Hash-rawdata : ",hex(hash(rawdata)))
print("Hash-rawdata : ",hex(hash(rawdata)))
print("Hash-rawdata1 : ",hex(hash(rawdata1)))
print("Hash-rawdata1 : ",hex(hash(rawdata1)))
print("Hash-rawdata1 : ",hex(hash(rawdata1)))
多次运行,结果如下:
# 第一次运行
thon\debugpy\adapter/../..\debugpy\launcher' '53510' '--' 'D:\Zero.App\PyQt.Demo\zero.hash\hsah.py'
Hash-rawdata : 0x2dbaf7fe96a1d731
Hash-rawdata : 0x2dbaf7fe96a1d731
Hash-rawdata : 0x2dbaf7fe96a1d731
Hash-rawdata1 : -0x4a06373e0e525a49
Hash-rawdata1 : -0x4a06373e0e525a49
Hash-rawdata1 : -0x4a06373e0e525a49
# 第二次 运行
(venv) PS D:\Zero.App\PyQt.Demo> d:; cd 'd:\Zero.App\PyQt.Demo'; & 'd:\Zero.App\PyQt.Demo\venv\Scripts\python.exe' 'c:\Users\LJM\.vscode\extensions\ms-python.python-2023.16.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '53519' '--' 'D:\Zero.App\PyQt.Demo\zero.hash\hsah.py'
Hash-rawdata : -0x62b9a6623c3140b
Hash-rawdata : -0x62b9a6623c3140b
Hash-rawdata : -0x62b9a6623c3140b
Hash-rawdata1 : 0x7c7ad2277463d6c3
Hash-rawdata1 : 0x7c7ad2277463d6c3
Hash-rawdata1 : 0x7c7ad2277463d6c3
如上,根据多次运行获取到的hash值对比特性汇总如下:
- 不一样的数据,那怕只是差了一个空格,肉眼不好观测,但是hash值上有非常大的区别;
- 同样的数据,在同一个进程中,多次获取hash值,结果是一样的;
- 同样的数据,在不同进程中,获取到的值是不一样的。
2.2 使用hashlib库进行hash计算
使用hashlib库,可以有效的避免直接使用hash()函数,存在不同进程计算值差异的问题。
2.2.1 基本使用
rawdata = "我只是一个测试数据"hash = hashlib.md5(rawdata.encode()) # 注意传入的数据需要是二进制bytes类型数据。
print("Hashlib使用hashlib.md5(rawdata) :")
print("type : ", type(hash)) # 数据类型
print("digest : ", hash.digest()) # 返回数据值
print("hexdigest: ", hash.hexdigest()) # 返回十六进制的摘要哈希值
结果:
Hashlib使用hashlib.md5(rawdata) :
type : <class '_hashlib.HASH'> # 类型,返回的是一个Hash类型
digest : b'\x93laB<*\x97\x84\x11\x94\xf9\x98\xcaY\xcb\xc6'
hexdigest: 936c61423c2a97841194f998ca59cbc6 # 十六机制的值
2.2.2 算法的选择
2.2.2.1 使用构造器
常用的算法如下,可以使用构造器直接使用。
elif sys.version_info >= (3, 8):def new(name: str, data: ReadableBuffer = b"") -> _Hash: ...def md5(string: ReadableBuffer = b"") -> _Hash: ...def sha1(string: ReadableBuffer = b"") -> _Hash: ...def sha224(string: ReadableBuffer = b"") -> _Hash: ...def sha256(string: ReadableBuffer = b"") -> _Hash: ...def sha384(string: ReadableBuffer = b"") -> _Hash: ...def sha512(string: ReadableBuffer = b"") -> _Hash: ...
2.2.2.2 使用new()方法
可以使用new()方法使用调用未创建构造器的算法。
print("使用new方法调用算法 :")
h = hashlib.new('sha512_256')
h.update(b"test")
print("hexdigest : ", h.hexdigest())
结果如下:
使用new方法调用算法 :
hexdigest : 3d37fe58435e0d87323dee4a2c1b339ef954de63716ee79f5747f94d974f913f
2.2.3 使用algorithms_guaranteed查看所有平台都支持的哈希算法名称
返回一个集合,其中包含此模块在所有平台上都保证支持的哈希算法的名称。
print("打印所有平台都支持的算法名称:")
print(hashlib.algorithms_guaranteed)打印所有平台都支持的算法名称:
{'sha384', 'sha3_384', 'md5', 'sha224', 'blake2s', 'sha3_224', 'shake_256', 'shake_128', 'blake2b', 'sha3_512', 'sha1', 'sha3_256', 'sha256', 'sha512'}
算法选用时建议使用通用性较强的算法,当然可以根据自己实际需求选择加密能力更强的。
2.2.4 使用algorithms_available查看当前解释器支持的哈希算法名称
返回一个集合,其中包含在所运行的 Python 解释器上可用的哈希算法的名称。
print("打印所运行的python解释器支持算法名称:")
print(hashlib.algorithms_available)打印所运行的python解释器支持算法名称:
{'sha512_224', 'whirlpool', 'sha256', 'shake_128', 'ripemd160', 'blake2s', 'sha3_224', 'sha3_384', 'mdc2', 'sha384', 'md4', 'sha224', 'md5', 'sha1', 'sm3', 'sha512', 'sha3_256', 'sha3_512', 'blake2b', 'md5-sha1', 'shake_256', 'sha512_256'}
2.2.5 使用digest()返回哈希值
返回当前已传给 update() 方法的数据摘要。 这是一个大小为 digest_size 的字节串对象,字节串中可包含 0 至 255 的完整取值范围。
2.2.6 使用hexdigest()返回十六进制哈希值
类似于 digest() 但摘要会以两倍长度字符串对象的形式返回,其中仅包含十六进制数码。 这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值。
2.2.7 使用update()函数添加数据
用 bytes-like object 来更新哈希对象。 重复调用相当于单次调用并传入所有参数的拼接结果: m.update(a); m.update(b) 等价于 m.update(a+b)。
print("使用update更新数据")
hash = hashlib.sha256()
hash.update(b"hello")
print(hash.hexdigest())
hash.update(b"word")
print(hash.hexdigest())
结果如下:
使用update更新数据
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
0b322d15ea034793a8646baa1744ffacbdf7f959b66c68970f032c4ac8b9c8cb
2.2.8 hash类型的其他方法
- hash.block_size:以字节表示的结果哈希对象的大小。
- hash.block_size:以字节表示的哈希算法的内部块大小。
- hash.name:此哈希对象的规范名称,总是为小写形式并且总是可以作为 new() 的形参用来创建另一个此类型的哈希对象。
- hash.copy():返回哈希对象的副本(“克隆”)。 这可被用来高效地计算共享相同初始子串的数据的摘要。
相关文章:

Python学习笔记-使用哈希算法Hash,Hashlib进行数据加密
文章目录 一、概述1.1 哈希算法1.2 常见算法分类1.2.1 SHA算法1.2.2 MD4算法1.2.3 MD5算法 1.3 Hash算法的特性1.4 Hash算法的应用场景1.4.1 数据校验1.4.2 安全加密1.4.3 数字签名 二、Hash算法使用2.1 使用hash函数直接获取hash值2.2 使用hashlib库进行hash计算2.2.1 基本使用…...

跨境电商能否成为黄河流域产业带的新引擎?
近年来,随着全球贸易格局的不断演变和中国经济的快速崛起,跨境电商已经成为中国外贸的一大亮点。而在中国国内,黄河流域产业带一直以其丰富的资源和悠久的历史而闻名,但也面临着转型升级的挑战。那么,跨境电商是否有潜…...

从数据到决策:企业投资信息查询API的关键作用
前言 在现代商业环境中,数据是一项无价的资产。企业不仅需要访问大量数据,还需要将这些数据转化为有用的见解,以支持战略决策。对于企业投资而言,准确的信息和实时的市场数据至关重要。在这个信息时代,企业投资信息查…...

NSIC2050JBT3G 车规级120V 50mA ±15% 用于LED照明的线性恒流调节器(CCR) 增强汽车安全
随着汽车行业的巨大变革,高品质的汽车氛围灯效、仪表盘等LED指示灯效已成为汽车内饰设计中不可或缺的元素。深力科安森美LED驱动芯片系列赋能智能座舱灯效充满艺术感和科技感——NSIC2050JBT3G LED驱动芯片,实现对每路LED亮度和颜色进行细腻控制…...

LuatOS-SOC接口文档(air780E)-- ftp - ftp 客户端
ftp.login(adapter,ip_addr,port,username,password)# FTP客户端 参数 传入值类型 解释 int 适配器序号, 只能是socket.ETH0, socket.STA, socket.AP,如果不填,会选择平台自带的方式,然后是最后一个注册的适配器 string ip_addr 地址 string port 端口,默认21 string…...

第二证券:市净率高好还是低好?
市净率是一个衡量公司股票投资价值的指标,通过比较公司股票价格和公司每股净资产的比值来评估公司股票的估值水平。市净率高好还是低好这个问题并没有一个简单的答案,取决于具体的市场环境和投资者的需求。本文将从多个角度分析市净率高好还是低好。 首…...

HTTP协议是什么
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议,是一种网络通信协议。 超文本:所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据。…...

微服务09-Sentinel的入门
文章目录 微服务中的雪崩现象解决办法:1. 超时处理2. 舱壁模式3. 熔断降级4.流量控制 Sentinel1.介绍2.使用操作3.限流规则4.实战:流量监控5.高级选项功能的使用1.关联模式2.链路模式3.总结 流控效果1.预热模式2.排队等待模式3.总结4.热点参数限流5.实战…...

2023-2024-1 高级语言程序设计实验一: 选择结构
7-1 古时年龄称谓知多少? 输入一个人的年龄(岁),判断出他属于哪个年龄段 ? 0-9 :垂髫之年; 10-19: 志学之年; 20-29 :弱冠之年; 30-39 &#…...

js事件循环详解
事件循环简介 JavaScript的事件循环是一种处理异步事件和回调函数的机制,它是在浏览器或Node.js环境中运行,用于管理任务队列和调用栈,以及在适当的时候执行回调函数。 事件循环的基本原理是,JavaScript引擎在空闲时等待事件的到…...

实战指南:使用 kube-prometheus-stack 监控 K3s 集群
作者简介 王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作系统 Lin…...

golang调用scws实现简易中文分词
1、安装 scws 官网以及文档 https://github.com/hightman/scws wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xjf -cd scws-1.2.3 ./configure --prefix/usr/local/scws --enable-shared make && make installLibraries have been ins…...

Excel 中使用数据透视图进行数据可视化
使用数据透视表(PivotTable)是在Excel中进行数据可视化的强大工具。下面将提供详细的步骤来使用数据透视表进行数据可视化。 **步骤一:准备数据** 首先,确保你有一个包含所需数据的Excel表格。数据应该按照一定的结构和格式组织…...

在SIP 语音呼叫中出现单通时要怎么解决?
在VoIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,注册问题,回声,单通等。这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定…...

【师兄啊师兄2】公布,李长寿成功渡劫,敖乙叛变,又一美女登场
Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 由玄机制作的师兄啊师兄第一季这才完结没有多久,没想到现在第二季就公布了,连海报和预告都出来了,看样子已经做得差不多了。预告看下来,能够明显感觉到官方又进步…...

视频倒着播放,原来是这么实现的
视频倒放是当今最流行的内容类型之一,这些视频服务于不同的目的,例如营销、娱乐、教育等。它们以独特的内容脱颖而出,并给观众留下深刻印象,将视频编辑带到了一个全新的水平。 在本文中,您将了解有关视频倒着播放的内…...

# 02 初识Verilog HDL
02 初识Verilog HDL 对于Verilog的语言的学习,我认为没必要一开始就从头到尾认真的学习这个语言,把这个语言所有细节都搞清楚也不现实,我们能够看懂当前FPGA的代码的程度就可以了,随着学习FPGA深度的增加,再不断的…...

使用 Eziriz .NET Reactor 对c#程序加密
我目前测试过好几个c#加密软件。效果很多时候是加密后程序执行错误,或者字段找不到的现象 遇到这个加密软件用了一段时间都很正常,分享一下使用流程 破解版本自行百度。有钱的支持正版,我用的是 Eziriz .NET Reactor 6.8.0 第一步 安装 Ezi…...

Restclient-cpp库介绍和实际应用:爬取www.sohu.com
概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库,它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp,支持GET, POST, PUT, PATCH, DELETE, HEAD等方法,以及自定义HTTP头部,超时设置,代理服…...

提升市场调研和竞品分析效率:利用Appium实现App数据爬取
市场调研和竞品分析通常需要获取大量的数据,而手动收集这些数据往往耗时且容易出错。而利用Appium框架,我们可以轻松地实现自动化的App数据爬取,这种方法不仅可以节省时间和人力成本,还可以提高数据的准确性和一致性。 Appium是一…...

【Git笔记】之Git重命名详解
目录 一、Git重命名文件 二、Git重命名origin 三、Git重命名分支 四、Git重命名远程分支 五、Git重命名作者 六、Git clone重命名 七、Git重命名仓库 八、Git重命名文件夹后出现两个代码 九、Git重命名文件名 Git是一个非常流行的版本控制工具,它可以帮助程…...

201、RabbitMQ 之 Exchange 典型应用模型 之 工作队列(Work Queue)
目录 ★ 工作队列介绍代码演示测试注意点1:注意点2: ★ 工作队列介绍 工作队列: 就是让多个消费者竞争消费同一个消息队列的消息,相当于多个消费者共享消息队列。 ▲ RabbitMQ可以让多个消费者竞争消费同一个消息队列 ▲ 消息队…...

了解三层架构:表示层、业务逻辑层、数据访问层
目录 背景: 三层架构 什么是三层: 分层的目的: 三层的结构关系编辑 三层表现形式:编辑 三层的优缺点: 总结: 背景: 三层架构是一种软件设计模式,可称为客户端-服务器-架构,把各个功能模块划分…...

三相空气开关
一、三相空开的作用 三相空气开关对任意一相出现过载或短路,均起到保护作用。 二、三相空气开关原理图: 1、老式空气开关 1)、短路时,电磁脱钩器工作 2)、过载时,发热元件引起双金属片弯曲,使脱钩器工作 3)、测试按…...

uniapp 单位rpx ,设计稿尺寸px处理方式
1.使用postcss-px2rpx 插件做全局的单位转换 npm install postcss-px2rpx -D npm 安装 2.postcss.config.js修改 module.exports {plugins: {postcss-px2rpx: {// 设计稿宽度,默认750designWidth: 750,// 需要转换的最小像素值,默认1pxminPixelValue: 1…...

@所有燃气企业,城燃企业数字化转型重点抓住的八个关键点
关键词:智慧燃气、燃气数字化、设备设施数字化 数字化转型是用信息技术全面重塑企业经营管理模式,是企业发展模式的变革创新,是企业从工业经济时代迈向数字经济时代的必然选择。加快推进企业数字化转型,打造数字时代企业业务运行…...

大数据学习(4)-hive表操作
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...

第二证券:汇金增持有望催化银行板块 白酒企稳信号凸显
昨日,两市股指盘中震动上扬,创业板指、科创50指数一度涨超1%,但沪指午后涨幅逐渐回落。到收盘,沪指涨0.12%报3078.96点,深成指涨0.35%报10084.89点,创业板指涨0.8%报2003.9点,科创50指数涨1.29%…...

Kubernetes使用OkHttp客户端进行网络负载均衡
在一次内部Java服务审计中,我们发现一些请求没有在Kubernetes(K8s)网络上正确地实现负载均衡。导致我们深入研究的问题是HTTP 5xx错误率的急剧上升,由于CPU使用率非常高,垃圾收集事件的数量很多以及超时,但…...

oracle设置自增ID
CREATE SEQUENCE 序列名 START WITH 1 INCREMENT BY 1 MINVALUE 1 ORDER NOCYCLE; //CREATE SEQUENCE “QMS”.“Untitled” MINVALUE 1 INCREMENT BY 1 START WITH 1 ORDER NOCACHE 创建触发器: create or replace trigger 触发器名 before insert on “表名” fo…...