Python 常用模块Hashlib

2023-12-18 06:12:58

【1】摘要算法和加密算法的

(1)摘要算法
  • 定义
    • 摘要算法是一种将任意长度的数据映射为固定长度摘要(哈希值)的算法
    • 常见的摘要算有MD5SHA1SHA-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破解方法(撞库)
# 简单示例代码
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。