hashlib 模块
一、什么是摘要算法
1、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
用于生成数据或文本的简短摘要或哈希值的算法。它们被广泛应用于密码学、数据完整性验证和信息检索等领域。摘要算法通过对输入数据进行计算和转换,生成一个固定长度的输出,通常称为摘要、哈希值或指纹。
2、摘要算法具有以下特点:
- 输入数据的微小变化会导致输出值的显著变化,这被称为雪崩效应。即使输入数据只有微小的改动,摘要值也会有很大差异。
- 摘要算法是单向的,即从摘要值无法推导出原始输入数据。这意味着无法通过摘要值逆向还原出原始数据。
- 摘要算法是快速计算的,无论输入数据的大小,生成摘要值的计算速度都相对较快。
3、常见的摘要算法包括:
- MD5(Message Digest Algorithm 5):MD5是一种广泛使用的摘要算法,生成128位的摘要值。然而,由于其易受碰撞攻击的安全性问题,现已不推荐在安全敏感的场景中使用。
- SHA(Secure Hash Algorithm)系列:SHA系列算法包括SHA-1、SHA-256、SHA-384和SHA-512等,它们分别生成不同长度的摘要值。SHA-256是目前广泛使用的安全摘要算法之一。
- 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_pwd
。hexdigest()
方法返回的是一个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("登录失败")