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

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 基本使用…...

跨境电商能否成为黄河流域产业带的新引擎?

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

从数据到决策:企业投资信息查询API的关键作用

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

NSIC2050JBT3G 车规级120V 50mA ±15% 用于LED照明的线性恒流调节器(CCR) 增强汽车安全

随着汽车行业的巨大变革&#xff0c;高品质的汽车氛围灯效、仪表盘等LED指示灯效已成为汽车内饰设计中不可或缺的元素。深力科安森美LED驱动芯片系列赋能智能座舱灯效充满艺术感和科技感——NSIC2050JBT3G LED驱动芯片&#xff0c;实现对每路LED亮度和颜色进行细腻控制&#xf…...

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…...

第二证券:市净率高好还是低好?

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

HTTP协议是什么

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

微服务09-Sentinel的入门

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

2023-2024-1 高级语言程序设计实验一: 选择结构

7-1 古时年龄称谓知多少&#xff1f; 输入一个人的年龄&#xff08;岁&#xff09;&#xff0c;判断出他属于哪个年龄段 &#xff1f; 0-9 &#xff1a;垂髫之年&#xff1b; 10-19&#xff1a; 志学之年&#xff1b; 20-29 &#xff1a;弱冠之年&#xff1b; 30-39 &#…...

js事件循环详解

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

实战指南:使用 kube-prometheus-stack 监控 K3s 集群

作者简介 王海龙&#xff0c;Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层操作系统 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 中使用数据透视图进行数据可视化

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

在SIP 语音呼叫中出现单通时要怎么解决?

在VoIP的环境中&#xff0c;特别是基于SIP通信的环境中&#xff0c;我们经常会遇到一些非常常见的问题&#xff0c;例如&#xff0c;单通&#xff0c;注册问题&#xff0c;回声&#xff0c;单通等。这些问题事实上都有非常直接的排查方式和解决办法&#xff0c;用户可以按照一定…...

【师兄啊师兄2】公布,李长寿成功渡劫,敖乙叛变,又一美女登场

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 由玄机制作的师兄啊师兄第一季这才完结没有多久&#xff0c;没想到现在第二季就公布了&#xff0c;连海报和预告都出来了&#xff0c;看样子已经做得差不多了。预告看下来&#xff0c;能够明显感觉到官方又进步…...

视频倒着播放,原来是这么实现的

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

# 02 初识Verilog HDL

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

使用 Eziriz .NET Reactor 对c#程序加密

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

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

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

提升市场调研和竞品分析效率:利用Appium实现App数据爬取

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

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...