Python 常用模块Hashlib
2023-12-18 06:12:58
【1】摘要算法和加密算法的
(1)摘要算法
- 定义
- 摘要算法是一种将任意长度的数据映射为固定长度摘要(哈希值)的算法
- 常见的摘要算有MD5、SHA1、SHA-256等
- 输出的摘要长度固定,无论输入数据长度是多长,输出摘要长度都固定
- 特点
- 不可逆性:无法通过摘要反推得到原始数据
- 唯一性:每一个数据数据都对应唯一的输出摘要
- 固定长度:无论输入数据长度,输出摘要长度固定
- 应用场景
- 数据完整性验证:验证数据在传输过程中是否被篡改
- 密码存储:存储密码的哈希值,避免存储明文数据
- 数字签名:验证数据的真实性和完整性
(2)加密算法
- 定义
- 加密算法是一种将原始数据(明文)转换成密文的算法,使用密码进行加密和解密
- 常见的加密算法有对称加密算法(如AES、DES)和非对称加密算法(如RSA)
- 特点
- 可逆性:加密和解密是可逆的,使用正确的密钥可以还原原始数据
- 使用密码:加密和解密需要使用密钥,对称加密使用相同密钥,非对称加密使用公钥和私钥、
- 应用场景
- 保密性:保护数据机密,确保只有授权的人能够解密和访问数据
- 安全通信:在网络通信中使用加密算法保护数据传输的安全性
- 数字签名:非堆成密钥用于生成和验证数字签名
【2】halshlib摘要算法模块
(1)MD5
hexdigest()
返回一个表示摘要值的十六进制字符串,更适合人类阅读。digest()
返回一个包含原始摘要值的字节对象,适合在二进制形式下进行处理,如存储或传输。
import hashlib
# 生成md5对象
md5 = hashlib.md5()
# <md5 _hashlib.HASH object> <class '_hashlib.HASH'>
# 需要将原始数据转换为字节序列
data = "Peace and love"
data = data.encode("utf8")
# 开始加密
md5.update(data)
# 加密摘要 十六进制 字符串 32位
print(md5.hexdigest())
# 869595810c2e5297c50a90d459c290ae
# 加密摘要 字节对象
print(md5.digest())
# b'\x86\x95\x95\x81\x0c.R\x97\xc5\n\x90\xd4Y\xc2\x90\xae'
(2)多次传值
- 合起来的内容相同,那么最终的摘要也相同
import hashlib
# 一次性传入
md5 = hashlib.md5()
data = "Peace and love"
data = data.encode("utf8")
md5.update(data)
print(md5.hexdigest())
# 869595810c2e5297c50a90d459c290ae
# 多次传入
md5 = hashlib.md5()
md5.update(b"Peace")
md5.update(b" ")
md5.update(b"and")
md5.update(b" ")
md5.update(b"love")
print(md5.hexdigest())
# 869595810c2e5297c50a90d459c290ae
(3)MD5破解方法(撞库)
- 没有绝对安全的数据
- MD5免费在线解密破解_MD5在线加密-SOMD5
- WiFi万能钥匙就是撞库破解
# 简单示例代码
import hashlib
# 目标摘要
object_code = "8f26358657e4635f9876bc6c2ebfa8d5"
# 已知密码库
already_library = [
"123456",
"789456",
"love",
"Peace"
]
def crack_code(object_code, already_library):
# 生成md5对象
md5 = hashlib.md5()
for code in already_library:
# 密码库转换成字节序列
code = code.encode("utf8")
md5.update(code)
# 摘要匹配
if object_code == md5.hexdigest():
print(f"解密成功,密码是{code.decode('utf8')}")
return
print("解密失败,已知库太小")
crack_code(object_code, already_library)
# 解密成功,密码是Peace
(4)密码加盐
- 原始数据或者摘要数据进行特殊处理
import hashlib
def encrypt(data):
# 加盐处理
# 对原始内容进行简单字符串处理
# 这里是将固定特殊内容拼接到原始内容的前后
data = "peace" + str(data) + "love"
data = data.encode("utf8")
md5 = hashlib.md5()
md5.update(data)
return md5.hexdigest()
print(encrypt(b"123456"))
# 3f9b706d9800d7a1253aca24bcdf8e23
【3】应用(登陆注册)
import hashlib
import json
import random
import string
def read_data():
# 读取user_dict.json 返回dict
with open("user_dict.json", "r", encoding="utf8") as fp:
data = json.load(fp=fp)
return data
def save_data(user_dict):
# 保存json格式用户信息
with open("user_dict.json", 'w', encoding="utf8") as fp:
json.dump(user_dict, fp=fp, ensure_ascii=False)
def encrypt(data, salt):
# 密码转换成字节格式
data = data.encode("utf8")
md5 = hashlib.md5()
# 获得摘要
md5.update(data)
res = md5.hexdigest()
# 加盐
res += str(salt)
return res
def get_n_captcha(n=4):
# 随机获取n个验证码
choice_list = list(string.digits + string.ascii_lowercase)
captcha_list = random.choices(choice_list, k=n)
captcha = "".join(captcha_list)
return captcha
def register():
# 获取用户名和密码
username = input("username>>>:").strip()
password = input("password>>>:").strip()
# 检验码验证
captcha = get_n_captcha(4)
captcha_input = input(f"captcha[{captcha}]>>>:")
if captcha_input != captcha:
print("captcha wrong")
return
# 密码加密获得摘要
password = encrypt(password, captcha)
user_dict = {"username": username, "password": password}
# 保存json格式数据
save_data(user_dict)
print("register successful")
def login():
# 获取登录信息
username = input("username>>>:").strip()
password = input("password>>>:").strip()
# 获得注册信息
user_dict = read_data()
# 获得加密的盐
salt = user_dict["password"][-4:]
password = encrypt(password, salt)
# 信息匹配
if username == user_dict["username"] and password == user_dict["password"]:
print("login successful")
return
print("username or password wrong")
register()
login()
文章来源:https://blog.csdn.net/weixin_48183870/article/details/135048274
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!