python hashlib模块及实例
- hashlib 模块
- 密码加密
- 密码撞库
- 密码加盐
一,hashlib模块
hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。
通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个特点:
- 经过同一个hash算法为字符串进行加密时,无论密码的长度为多少,经过加密后得到的hash值长度都是相同的。
- 当传入的字符串密码(明文)相同的话,经过同一个hash算法得到的hash值(密文)会是相同的。 ===>> 可以用于进行文件的校验
- 通过hash算法得到的hash值(密文),是不能进行反解的,也就是说不能通过密文来反推用户的明文密码的。 ===>> 可以用来对用户的明文密码进行加密,防止被盗号等。
二,密码加密
通过调用hashlib模块下的hash算法就可以将传入的字符串进行相应hash算法的明文加密,得到一串hash值,也就是一串经过hash算法之后得到的密文。将该密文写入文件中,然后当用户登录时,在文件中比对密文来判断是否登录成功。
为了方便理解,我们可以将hashlib中的hash算法理解为一个工厂,用户传入的明文为原材料,而后输出的密文就是该工厂经过加工的产品。
1,代码演示:
import hashlibpasswords1 = hashlib.sha256() # 调用sha256的hash算法passwords1.update('liming666'.encode('utf-8')) # 传入密码1
print('密码1:' + passwords1.hexdigest())passwords2 = hashlib.sha256()passwords2.update('@liming666'.encode('utf-8')) # 传入密码2
print('密码2:' + passwords2.hexdigest())
密码1:b474b63a855469a9f8d4ff63bba2c7b9577a50c1456439133cb3fedf63e4a642
密码2:9c8f8252922d5baf7dc12b0e0d6be09df185aa2b22686897be89ceda97f5db0f
请按任意键继续. . .
可以看到,这里传入的密码1跟密码2 的长度是不一样的,但是经过同一种hash算法转化成密文之后密文的长度是一样长的,所以经过同一中hash算法,不管传入的明文密码的长度是多长,转换后的密文长度都是一样长的。
2,传入的明文长度不同,但是得到的密文长度一样长。
import hashlibpasswords1 = hashlib.sha256() # 调用sha256的hash算法passwords1.update('liming666'.encode('utf-8')) # 传入密码1
print('密码1:' + passwords1.hexdigest())passwords2 = hashlib.sha224() # 注意:这里换了一种hash算法。passwords2.update('@liming666'.encode('utf-8')) # 传入密码2
print('密码2:' + passwords2.hexdigest())
密码1:b474b63a855469a9f8d4ff63bba2c7b9577a50c1456439133cb3fedf63e4a642
密码2:8b0a4e58f5120ae85d772d5301edd67c36aeb9192a0c2a9b7cfbbce9
请按任意键继续. . .
通过结果可以看到,经过不同的hash算法得到的密文长度是不一样的。所以不同的hash算法会得到不同的hash值,也就是密文不同。
需要注意的是,通过hashlib.update()函数,在为其传参的时候可以不用一次性的全部将明文传过去,可以分步传值。
3,分步传明文字符串,得到的密文是一样的。
import hashlibpasswords1 = hashlib.sha256() # 调用sha256的hash算法passwords1.update('@'.encode('utf-8')) # 分步传值
passwords1.update('liming'.encode('utf-8'))
passwords1.update('666'.encode('utf-8'))
print('密码:' + passwords1.hexdigest())passwords2 = hashlib.sha256() passwords2.update('@liming666'.encode('utf-8')) # 一次性全部传过去
print('密码:' + passwords2.hexdigest())
密码:9c8f8252922d5baf7dc12b0e0d6be09df185aa2b22686897be89ceda97f5db0f
密码:9c8f8252922d5baf7dc12b0e0d6be09df185aa2b22686897be89ceda97f5db0f
可以看到, 即使分步传,最后得到的密文依旧是同样的。
4,小小的注意点
如果足够细心的话,可能一些读者可能注意到了,在实例3的代码中,调用了两次hashlib.sha256(),也就是这里有passwords1和passwords2,所以可能存在疑问,为什么不能直接调用一次hashlib.sha256() 呢?当只调用一次的话,其实也会得到一串hash值,但是并不是想要的明文转换成的密文。
代码演示一下吧:
import hashlibpasswords1 = hashlib.sha256() # 调用sha256的hash算法passwords1.update('liming'.encode('utf-8'))
passwords1.update('666'.encode('utf-8'))passwords1.update('@liming666'.encode('utf-8')) # 一次性全部传过去
print('密码:' + passwords1.hexdigest())passwords2 = hashlib.sha256() passwords2.update('liming666@liming666'.encode('utf-8'))
print('密码:' + passwords2.hexdigest())
密码:3a9568d16ee8080a265eab8f73750b3771477b25e0bc97313a0a803109ccf084
密码:3a9568d16ee8080a265eab8f73750b3771477b25e0bc97313a0a803109ccf084
请按任意键继续. . .
可以看到的是两种转化后密文是一样的,也就是说当向hash算法中通过update()函数向这个工厂中送原材料时,这些原材料会一直存在在工厂中,然后一起被加密。
三,密码撞库
密码撞库,简单理解就是创建一个猜测可能是明文密码的字典,然后将这些明文转换成密文,然后跟截获的密文进行比对,但密文相同的话那么通过字典就知道了对应的明文密码。当然这些撞库的前提是知道了明文加密的方式,也就是知道了明文加密的hash算法。
代码演示:
import hashlibpasswords_hash = 'cd1066bd6328de760c77b3ad975a4bbaa93462746f69eca165969fbc765f0169' # 截获的密文
passwd = ['liming666','@liming666','liming@666','liminglovexiaohong666','liming+qq'] # 猜测的可能是正确的明文密码dic = {}for value in passwd:res = hashlib.sha256(value.encode('utf-8'))dic[value] = res.hexdigest()# 此时字典dic中key = 明文,value = 密文for k,v in dic.items():if v == passwords_hash:print('撞库成功')print("明文密码为%s"%k)breakelse:print("尝试下一个明文密码")
尝试下一个明文密码
尝试下一个明文密码
尝试下一个明文密码
尝试下一个明文密码
撞库成功
明文密码为liming+qq
请按任意键继续. . .
这样就完成了简单的撞库实例。
四,密码加‘盐 ’
我们知道没有绝对安全的密码,所以我们所能做的就是增大对方破解明文密码的成本。就相当于一个用户的账户只有一块钱,结果一个人却花了10天来破解密文密码,连时间成本都不够,这样别人也懒得破解密码了。那么回到话题上,密码加盐,简单来说就是为用户在注册密码的时候增加一点东西进去,这样就可以增大别人进行密码撞库的成本。这样除非破解者知道加的‘盐’是什么才能增大破解的成功率,但是设计者添加的‘盐’,破解者应该是很难猜到的。
# 简单的密码加盐import hashlib
passwords = hashlib.sha256('天王'.encode('utf-8'))
passwords.update('liming666'.encode('utf-8'))
passwords.update('盖地虎'.encode('utf-8'))
print(passwords.hexdigest())print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
passwords1 = hashlib.sha256()
passwords1.update("天王liming666盖地虎".encode('utf-8'))
print(passwords1.hexdigest())
d6f759a30f9c875caa58f7a341cce140245d6eea762ef1d1da75f4caec006e66
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
d6f759a30f9c875caa58f7a341cce140245d6eea762ef1d1da75f4caec006e66
这样经过加盐之后,即使被截获了密文密码,但是不知道加的‘盐’是什么,依旧是无法进行破解的。即使知道了‘盐’是什么,依旧会增加撞库的成本。
相关文章:
python hashlib模块及实例
hashlib 模块密码加密密码撞库密码加盐 一,hashlib模块 hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…...
垃圾回收GC
为什么要有垃圾回收? JVM之所以要有垃圾回收,是因为它能够自动管理内存,避免内存泄漏和内存溢出的问题,垃圾回收机制会自动检测和清理不再使用的对象,释放内存空间,使得开发者不需要手动管理内存,降低了开发难度和错误风险,同时,垃圾回收还可以优化内存分配,提高程序性能和响…...
kubernetes-service微服务
目录 一、service微服务 二、Ipvs模式 三、ClusterIP 1.ClusterIP 2.headless 四、NodePort 1.NodePort 2.默认端口 五、LoadBalancer 1.LoadBalancer 2.metallb 六、ExternalName 一、service微服务 Kubernetes Service微服务是一种基于Kubernetes的微服务架构&…...
让你笑到不行的笑话短视频接口,快来试试!
11在当今这个快节奏的社会中,笑话成为了许多人调节情绪的有效方法。如今,短视频平台已经成为了最受欢迎的娱乐方式之一,因此,将笑话和短视频结合起来,成为了一种很有趣的方式来带给我们欢乐。今天我们要介绍的是挖数据…...
系列四十五、Spring的事务传播行为案例演示(五)#MANDATORY
一、演示Spring的传播行为(MANDATORY) 1.1、StockServiceImplMANDATORY /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description: 演示MANDAORY的传播行为* 外部不存在事务:抛出异常 No existing transaction found for…...
idea插件(二)-- String Manipulation(字符串处理工具)
目录 1. 安装 String Manipulation 2. 默认快捷键 3. 操作说明 3.1 变量名的形式处理 3.2 文本形式的转化...
HQChart实战教程67-worker批量计算股票指标
HQChart实战教程67-worker批量计算股票指标 什么是Worker批量指标计算示例地址步骤1. 创建一个后台工作线程类2. 发送指标计算任务3. 接收计算结果数据对接 完整源码demo_workerthread_sina.htmlhqchart_worker_sina.js HQChart插件源码地址 什么是Worker Worker 接口是 Web W…...
博客系统自动化测试项目实践
文章目录 一.测试需求分析1.功能分析2.非功能分析 二.制定测试方案(计划 策略)三.编写测试用例四.执行自动化测试用例五.编写测试报告六.项目总结 一.测试需求分析 1.功能分析 通过功能测试需求分析 2.非功能分析 非功能分析主要从:界面,性能,安全性,…...
软考高级之系统架构师系列之操作系统基础
概念 接口 操作系统为用户提供两类接口:操作一级的接口和程序控制一级的接口。操作一级的接口包括操作控制命令、菜单命令等;程序控制一级的接口包括系统调用。 UMA和NUMA UMA,统一内存访问,Uniform Memory Access,…...
制作一个可以arm架构下运行的docker镜像(for Python)
看完本篇文章,你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率,因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…...
Goland连接服务器/虚拟机远程编译开发
创建SSH连接 SSH用于与远程服务器建立连接 Settings -> Tools -> SSH Configurations 添加新的ssh连接,Host为ip地址,Username为用户名,认证方式这里选择密码验证 全部填完后可以点击Test Connection测试连接是否成功 创建Deployment…...
大数据Doris(十四):Doris表中的数据基本概念
文章目录 Doris表中的数据基本概念 一、Row & Column...
【Linux】Linux环境配置以及部署项目后端
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Linux环境配置 1.JDK ①上传安装包到…...
RabbitMQ消费者的可靠性
目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制(Consumer Acknowledgement)。即:当消费者处理消息结束后&#x…...
云计算助力史上首届“云上亚运”圆满成功!
201金,魔幻的BGM,以及崛起的中国科技,让杭州亚运会成功出圈。 很多网友表示太震撼了!开幕式很漂亮,杭州为了奥运造新城真豪横,看完一整个文化自信住! 赛场内外除了无数个令人感动的瞬间&#…...
博彦科技:以金融为起点,凭借创新技术平台真打实干
【科技明说 | 重磅专题】 成立于1995年的博彦科技,已有28年左右的发展历程。 我没有想到,博彦科技也对AIGC领域情有独钟。博彦科技自研的数字人产品SaaS平台,可以接入包括百度文心一言、阿里通义千问等AI大模型产品。可见&#…...
NLP实践——中文指代消解方案
NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务,有很多开源的项目和工具可以借鉴,比如spacy的基础模…...
【Redis】认识Redis-特点特性应用场景对比MySQL重要文件及作用
文章目录 认识redisredis的主要特点redis的特性(优点)redis是单线程模型,为什么效率这么高,访问速度这么快redis应用场景redis不可以做什么MySQL和Redis对比启动RedisRedis客户端Redis重要文件及作用 认识redis redis里面相关的小…...
goland setup go env
go env -w设置的变量,在goland中不生效,需要额外配置。 点击goland->preference,在go module里,设置go环境变量即可。...
如何打造一支敏捷测试团队
文章目录 摘要01 从测试角度理解敏捷理念什么是敏捷?测试人员应该怎样理解敏捷理念?敏捷宣言对于测试活动的启发与思考总结如下。敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例敏捷测试原则…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...
