python hashlib模块及实例

2023-11-01 23:44
文章标签 python 模块 实例 hashlib

本文主要是介绍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模块及实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/326599

相关文章

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下