Python学习笔记-使用哈希算法Hash,Hashlib进行数据加密

news2024/10/5 2:03:29

文章目录

  • 一、概述
    • 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():返回哈希对象的副本(“克隆”)。 这可被用来高效地计算共享相同初始子串的数据的摘要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Win10电脑无线网卡的移动热点无法开启问题

一、目的 利用无线网卡连接网络&#xff0c;然后又用无线网卡通过移动热点分享该网络。 移动热点&#xff0c;简单地说&#xff0c;就是将台式机或笔记本的 Internet 连接转化成 WIFI 信号以供移动设备无线上网的功能&#xff0c;硬件前提是电脑须安装有无线网卡。 二、问题 …

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法 1、最近邻插值法 1、最近邻插值法 *最邻近插值&#xff1a;将每个目标像素找到距离它最近的原图像素点&#xff0c;然后将该像素的值直接赋值给目标像素 优点&#xff1a;实现简单&#xff0c;计算速度快缺点&…

运维少背锅? 7 种常见监控工具,你是否用过?

运维监控工具千千万&#xff0c;仅开源的解决方案就有流量监控&#xff08;MRTG、Cacti、SmokePing、Graphite等&#xff09;和性能告警&#xff08;Nagios、Zabbix、Zenoss Core、Ganglia、OpenTSDB等&#xff09;可供选择。 并且每种软件都有自己的特点和功能&#xff0c;各…

OpenCV4(C++)——模板匹配

matchTemplate 模板匹配和卷积运算大致相同&#xff0c;模板图类似于卷积核&#xff0c;从原图的左上角开始进行滑动窗口的操作&#xff0c;最后得到一个特征图&#xff0c;这个特征图里的数值就是每次计算得到的相似度&#xff0c;通用匹配方式&#xff0c;相似值是&#xff…

【博客搭建】1、拾壹博客本地启动遇到的问题和需要注意的坑

一、后端&#xff08;blog&#xff09;启动 1、修改application.yml中的数据库链接与密码&#xff0c;Redis账号密码&#xff0c;即可启动成功&#xff1b; 2、运行之前先导入sql&#xff1b; 3、 如需上传文件保存至本地&#xff08;例如相册的照片&#xff09;&#xff0c;需…

Verilog功能模块——异步FIFO

前言 FIFO的功能 FIFO在FPGA中应用很多&#xff0c;它主要有以下功能&#xff1a; 数据缓存&#xff0c;很多时候数据发送速度和数据接收速度并不实时匹配&#xff0c;而在其中插入一个FIFO&#xff0c;来临时存储数据&#xff0c;就能平衡发送和接收速度组合与分解数据&…

什么是系统架构师?什么是系统架构?

1. 什么是系统架构师&#xff1f; 系统架构设计师(System Architecture Designer&#xff09;是项目开发活动中的关键角色之一。系统架构是系统的一种整体的高层次的结构表示&#xff0c;是系统的骨架和根基&#xff0c;其决定了系统的健壮性和生命周期的长短。 系统架构设计…

允许访问:掌握权限的艺术

回到20世纪&#xff0c;网络攻击更难实施&#xff0c;因为大多数计算机没有联网&#xff0c;互联网并不普及&#xff0c;只有少数人群可以访问计算机&#xff0c;更重要的是&#xff0c;没有足够的动机来进行攻击。 访问控制政策 而今天&#xff0c;情况完全不同。在糟糕的数据…

【特纳斯电子】血氧饱和度监测仪设计-实物设计

视频及资料链接&#xff1a;血氧饱和度监测仪设计-实物设计 - 电子校园网 编号&#xff1a; T5662203M-SW 设计简介&#xff1a; 本设计是基于STM32的血氧饱和度监测仪系统&#xff0c;主要实现以下功能&#xff1a; 1. STM32单片机作为微处理器 2. MAX30102进行心率血氧检…

A股风格因子看板 (2023.10 第03期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第03期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

【环境】ubuntu下anaconda虚拟环境中安装的pytorch终于配置成功了!

前请提要 配置情况&#xff1a;双系统——win10ubuntu20.04&#xff1b;anaconda安装与虚拟环境创建&#xff1a;在安装conda的过程中&#xff0c;我修改了安装路径&#xff08;很清楚的记得&#xff09;&#xff1b;昨晚的状态&#xff1a;通过pytorch中的conda命令&#xff…

Linux磁盘常见知识

目录 一、基础概念 1.1 文件系统类型 1.2 主分区、扩展分区、逻辑分区三者关系 1.3 UUID 1.4 lvm逻辑卷管理系统 二. 常用命令 2.1 查看命令 2.2 分区命令 2.3 格式化命令 1.4 挂载命令 三、扩容根目录 一、基础概念 1.1 文件系统类型 文件系统类型决定了向分区中存放、读取数…

再一次整理一下spring框架步骤

1.pom.xml依赖 2.applicationbean.xml 3.类 小树叶可以跟bean联动起来 不写接口直接写类 实现类 4.测试 两种方法的实现

第二证券:锂矿板块发力走高,江特电机涨停,中矿资源等拉升

锂矿板块12日盘中发力走高&#xff0c;到发稿&#xff0c;江特电机涨停&#xff0c;中矿资源、融捷股份涨超4%&#xff0c;天齐锂业、天华新能、永兴资料、赣锋锂业等涨逾3%。 音讯面上&#xff0c;江特电机“探转采”作业取得开展。 10月9日&#xff0c;国家天然资源部官网闪…

2023年中国鸡蛋市场供需现状、市场规模及产品价格走势分析[图]

鸡蛋具有高营养、易消化、用途广等特点&#xff0c;已成为世界公认的必备优质食材&#xff0c;它同肉品、乳品、蔬菜、粮食一样&#xff0c;是人们日常生活中的重要营养食品。鸡蛋的主要品种包括谷物蛋、绿色蛋、素养蛋、OMG营养蛋等。 蛋鸡是指专门产蛋以供应人们食用和加工蛋…

获央视报道 联通智网科技全面引领车联网发展

当前&#xff0c;我国正由交通大国阔步迈向交通强国&#xff0c;涌现出了一批交通行业的专精特新企业&#xff0c;带动了我国交通行业的蓬勃发展。联通智网科股份有限公司作为中国联通在车联网领域的专精特新企业&#xff0c;一直坚持融合创新并积极探索车联网和智慧交通相关领…

Unity基础课程之物理引擎8-扔保龄球游戏案例(完)

三个脚本&#xff1a; 1.给求添加力 2.分数管理器 3.检测是否发生碰撞 ----------------------------------------------- 脚本源码 1.给求添加力 using System.Collections; using System.Collections.Generic; using UnityEngine;public class RoleControl : MonoBeha…

通讯网关软件022——利用CommGate X2MQTT实现MQTT访问MSSQL服务器

本文介绍利用CommGate X2MQTT实现MQTT访问MS SQL数据库。CommGate X2MQTT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过MQTT来获取MS SQL数据库的数据。 【解决方案】设置网…

EDUSRC-记某擎未授权与sql注入

目录 360天擎 - 未授权与sql注入 信息收集 FOFA语法 鹰图搜索 360天擎未授权访问 - 数据库信息泄露 漏洞复现 修复方案 360天擎终端安全管理系统ccid处SQL注入 漏洞复现 手动测试方法 修复方案 360天擎 - 未授权与sql注入 通常访问的页面如下&#xff0c;存在登录框…

Vue2 router详解

vue2 router详解 一、前端路由的概念与原理1. 什么是路由2. SPA与前端路由3. 什么是前端路由4. 前端路由的工作方式5. 实现简易的前端路由 二、vue-router的基本用法1. 什么是 vue-router2. vue-router 安装和配置的步骤2.2 创建路由模块2.3 导入并挂载路由模块2.4 声明路由链接…