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

python hashlib模块及实例

  • hashlib 模块
  • 密码加密
  • 密码撞库
  • 密码加盐

一,hashlib模块

hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。

通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个特点:

  1. 经过同一个hash算法为字符串进行加密时,无论密码的长度为多少,经过加密后得到的hash值长度都是相同的。
  2. 当传入的字符串密码(明文)相同的话,经过同一个hash算法得到的hash值(密文)会是相同的。 ===>> 可以用于进行文件的校验
  3. 通过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&#xff0c…...

制作一个可以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 诊断脑暴会的成果示例敏捷测试原则…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...