Python的hashlib模块

发布时间 2023-12-07 23:20:14作者: JessicaJJmm

一、什么是摘要算法

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("登录失败")