首页 > 编程语言 >Python的hashlib模块

Python的hashlib模块

时间:2023-12-07 23:23:36浏览次数:30  
标签:username hashlib 加密 模块 Python utf8 str new password

一、什么是摘要算法

1、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)

用于生成数据或文本的简短摘要或哈希值的算法。它们被广泛应用于密码学、数据完整性验证和信息检索等领域。摘要算法通过对输入数据进行计算和转换,生成一个固定长度的输出,通常称为摘要、哈希值或指纹。

2、摘要算法具有以下特点:

  1. 输入数据的微小变化会导致输出值的显著变化,这被称为雪崩效应。即使输入数据只有微小的改动,摘要值也会有很大差异。
  2. 摘要算法是单向的,即从摘要值无法推导出原始输入数据。这意味着无法通过摘要值逆向还原出原始数据。
  3. 摘要算法是快速计算的,无论输入数据的大小,生成摘要值的计算速度都相对较快。

3、常见的摘要算法包括:

  1. MD5(Message Digest Algorithm 5):MD5是一种广泛使用的摘要算法,生成128位的摘要值。然而,由于其易受碰撞攻击的安全性问题,现已不推荐在安全敏感的场景中使用。
  2. SHA(Secure Hash Algorithm)系列:SHA系列算法包括SHA-1、SHA-256、SHA-384和SHA-512等,它们分别生成不同长度的摘要值。SHA-256是目前广泛使用的安全摘要算法之一。
  3. CRC(Cyclic Redundancy Check):CRC算法主要用于数据完整性校验,生成固定位数的校验值。它常用于网络传输或存储介质中的数据错误检测。

摘要算法的主要应用包括文件完整性验证、数字签名、密码存储、数据去重和信息检索等领域。它们提供了一种快速、安全且有效的方式来处理大量数据并验证其完整性。

二、进行加密操作

1、加密操作的基本使用

先选择加密方式:md系列、sha系列

不同的加密方式,加密出来的结果长度越长,被破解的难度越大,但是,在数据传输的过程中,占用资源的就越多

m = hashlib.md5()

 

对数据进行加密,此处对‘hello’进行加密

m.update('hello'.encode('utf8')) # update函数里面的数据必须是字节类型 bytes类型的

 

获取加密之后的结果

res = m.hexdigest()
print(res) # 5d41402abc4b2a76b9719d911017c592

 

2、对数据进行加密

m.update('123456'.encode('utf8'))
或者
m.update(b'123456')

 

总结:

1.注意⚠️:update函数里面的数据必须是字节类型 bytes类型的,否则报错

TypeError: Unicode-objects must be encoded before hashing

 

2.m = hashlib.md5(): 创建一个hashlib模块的MD5哈希对象。MD5是一种常用的哈希算法,用于将数据(这里是字符串)转换为固定长度的哈希值。 

3.m.update(new_str.encode('utf8')): 使用update()方法将待哈希的字符串new_str进行编码(这里使用UTF-8编码),并更新MD5对象的内部状态。通过多次调用update()方法可以在哈希对象中追加更多的数据。

4.new_pwd = m.hexdigest(): 调用hexdigest()方法,将MD5对象的当前哈希值以字符串形式返回,并赋值给变量new_pwdhexdigest()方法返回的是一个32位的十六进制字符串,表示计算得到的MD5哈希值。

三、实际应用

对登录注册用户的密码使用加密操作:简单加密、加盐、动态加密

1、简单的加密操作

import hashlib
 
# 注册功能
----------------------------------------------------------
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
# 加密用户输入的密码
m = hashlib.md5()
str = password
m.update(str.encode('utf8'))
new_password = m.hexdigest()
 
#  把用户名和密码写入到文件中
res = "%s|%s" % (username, new_password)
 
#  写入文件中
with  open('userinfo.txt', 'w', encoding='utf8') as f:
    f.write(res)
 
## zjz|e10adc3949ba59abbe56e057f20f883e
 
 
# 登录功能
----------------------------------------------------------
 
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
# 比对密码
with  open('userinfo.txt', 'r', encoding='utf8') as f:
    # real_username, real_password, random_str = f.read().split('|')
    real_username, real_password = f.read().split('|')
 
# 把用户输入的密码进行加密
m = hashlib.md5()
str = password
m.update(str.encode('utf8'))
new_pwd = m.hexdigest()
if real_username == username and real_password == new_pwd:
    print("登录成功")
else:
    print("登录失败")

 

2、加盐操作

"加盐"是指在使用哈希函数进行密码存储或认证时,在原始密码上附加一个随机生成的额外字符串,称为盐(salt)。

加盐的目的是增加密码哈希的安全性,防止彩虹表攻击和预计算哈希表攻击等密码破解方法。

import hashlib
 
# 注册功能
--------------------------------------------------
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
m = hashlib.md5()
 
#  加盐处理
random_str = '@hello'
 
# 密码拼接加盐指定的字符串
new_str = password + random_str
 
m.update(new_str.encode('utf8'))
 
new_password = m.hexdigest()
 
#  2. 把用户名和密码写入到文件中
res = "%s|%s" % (username, new_password)
 
#  3. 写入文件中
with  open('userinfo.txt', 'w', encoding='utf8') as f:
    f.write(res)
 
# zjz|7b9d78ad54a77b152d7b172504ce9f6b
 
 
# 登录功能
--------------------------------------------------
# 1. 输入用户名和密码
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
# 2. 比对密码
with  open('userinfo.txt', 'r', encoding='utf8') as f:
    real_username, real_password = f.read().split('|')
 
# 把用户输入的密码进行加密
m = hashlib.md5()
random_str = '@hello'
 
new_str = password +  random_str
 
m.update(new_str.encode('utf8'))
 
new_pwd = m.hexdigest()
 
if real_username == username and real_password == new_pwd:
    print("登录成功")
else:
    print("登录失败")

 

3、动态加密(使用随机函数生成随机的加盐字符串)

import hashlib
import random
 
# 注册功能
------------------------------------------------------
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
#  随机函数
def get_code(n):
    code = ''
    for i in range(n):
        num = random.randint(0, 9)
        work = chr(random.randint(97, 122))
        ranone = random.choice([num, work])
        code = ''.join([code, str(ranone)])
    return code
 
#  动态加盐处理
random_str = get_code(5)
 
new_str = password + random_str
 
m = hashlib.md5()
 
m.update(new_str.encode('utf8'))
 
new_password = m.hexdigest()
 
#   把用户名和密码、随机字符串 写入到文件中
res = "%s|%s|%s" % (username, new_password, random_str)
 
#  写入文件中
with  open('userinfo.txt', 'w', encoding='utf8') as f:
    f.write(res)
 
# zjz|2c7698524af5601a7d75dac54aa60658|2eg5x
 
 
# 登录功能
------------------------------------------------------
# 1. 输入用户名和密码
username = input("username:>>>").strip()
password = input("password:>>>").strip()
 
# 2. 比对密码
with  open('userinfo.txt', 'r', encoding='utf8') as f:
    real_username, real_password, random_str = f.read().split('|')
 
# 把用户输入的密码进行加密
m = hashlib.md5()
 
new_str = password + random_str
 
m.update(new_str.encode('utf8'))
 
new_pwd = m.hexdigest()
 
if real_username == username and real_password == new_pwd:
    print("登录成功")
else:
    print("登录失败")

 

标签:username,hashlib,加密,模块,Python,utf8,str,new,password
From: https://www.cnblogs.com/Jessica-Jmm/p/17884232.html

相关文章

  • debug-聪明办法学Python
    如何Debug调试理论开始调试之前通过不断地调试,比如在循环中打印某个元素检查不得不承认机器永远只认编程语言不过你必须要时刻关注你的变量名称是否发生变更,这在大改前必须要注意的调试已知程序有bug,如何找到?调试困难的根本原因因为bug的触发经历了漫长的过程需求->设......
  • Python之的sys、os、subprocess、shutil 模块
    一、sys模块 sys模块是与python解释器交互的一个接口1、sys.argv() 在Python中,sys.argv是一个列表,它包含了命令行参数传递给Python脚本的参数值。sys.argv列表的第一个元素是脚本的名称,后面的元素是传递给脚本的参数。importsys#打印脚本名称print("脚本名称:",s......
  • python第五次学习笔记
    1.调试: 调试(debugging)是暂停正在运行的程序,并解决程序中出现的问题的过程。调试Python程序非常简单,Python调试器会设置条件断点,并一次执行一行代码。接下来我们将使用Python标准库中的pdb模块调试Python程序。2.调试技术: 我们可以使用多种方法调试Python程序,以下是调试......
  • Python的json序列化模块
    一、jsonJson模块提供了四个功能:dumps、dump、loads、load1、前景什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。序列化的目的以某种存储形式使自定义对象持久化;将对象从一个地方传递到另一个地方。使程序更具维护性在Python中,能够......
  • python的异步迭代器含义
    python的异步迭代器什么意思?什么是迭代器:迭代器是一种遵循迭代器协议的对象,可以被用在像for循环这样的迭代环境中。迭代器协议包含两个方法:__iter__():返回迭代器自身。__next__():返回迭代器的下一个元素。如果没有更多元素,则抛出StopIteration异常。就是这两个方法要包......
  • python-文件IO操作实例
    一、如何复制文件1、使用shutil模块来复制importshutil#导入shutil模块#定义源文件和目的文件的路径#图片src_path="E:/python/py/基础篇/01_基础/06_文件操作/图片.jpg"dst_path="D:/图片.jpg"#文本src1_path="E:/python/py/基础篇/01_基础/06_文件操作/......
  • 聪明办法学Python 选学02
    聪明办法学Python学习笔记调试Debug1.如何进行Python程序调试,包括调试理论和常用模块与库的使用调试的必要性在于程序可能出现不符合预期结果的情况调试的困难在于bug的触发原因多种多样,只能看到最终结果2.调试代码的基本思路和方法,包括利用print和断言来解决简单......
  • Python-xlrd读取Excel指定列a~b行数据并绘图
    importxlrd#读取Excel文件wb=xlrd.open_workbook(r"E:\PythonStudyAll\TestD20231130\1111.xlsx")data=wb.sheet_by_name('Sheet1')#定义要读取的列和行范围column_index_x=0#第一列的索引为0column_index_y=1#第一列的索引为0start_row=2#起始行索......
  • 聪明办法学python最后一集
    聪明办法学python最后一集关于程序员如何进行debug首先编程哲学机器永远是对的可以使用print进行一部分的实验(这也算是我经常使用的方法)断点调试就是从上向下执行时进行的判断bug位置断点这个地方,主要分为两步:「找断点」和「打断点」。找断点,就是你想调试的代码块的......
  • 【Python】【OpenCV】检测直线和圆
     重新理解一下Canny方法:参数:image:输入的图像。threshold1:第一个阈值,用于检测边缘的强度梯度的下限。threshold2:第二个阈值,用于检测边缘的强度梯度的上限。apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3。L2gradient:一个布尔值,指示是否使用更精确的L2范数计算梯度......