hashlib模块

【一】什么是摘要算法

Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等。 摘要算法又称哈希算法、散列算法。 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest 目的是为了发现原始数据是否被人篡改过。 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数 计算f(data)很容易,但通过digest反推data却非常困难。 而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

【二】使用

复制代码
import hashlib
import json
import random
​
​
def one():
    # 给原始数据
    data = 'my name is dream'
    # 转成二进制数据
    data = data.encode('utf-8')
    # 创建一个md5对象
    md5 = hashlib.md5()
    # 把原始数据给 md5 对象加密
    md5.update(data)
    # 返回加密后的结果
    # 一种是加密后的16 进制的32 长度的字符串
    print(md5.hexdigest())
    # 一种是二进制数据
    print(md5.digest)
​
    # 把常见的这种字符 用md5加密 ---> 扔到数据库里面
    # 数据库中查 又返回
    return md5.hexdigest()
​
​
import random
​
​
def get_v_code(n):
    code = ''
    for i in range(n):
        random_int = str(random.randint(0, 9))  # 0-9之间的整数
        random_upper = chr(random.randint(65, 90))  # A-Z之间的大写字母
        random_lower = chr(random.randint(97, 122))  # a-z之间的小写字母
        temp = random.choice([random_int, random_upper, random_lower])
        code += temp
    return code
​
​
def two():
    code = get_v_code(6)
    # 给原始数据
    data = 'my name is dream'
    # 转成二进制数据
    data = data.encode('utf-8')
    code = code.encode('utf-8')
    # 创建一个md5对象
    md5 = hashlib.md5()
    # 把原始数据·给md5对象加密
    md5.update(code)
    md5.update(data)
    # 返回加密后的结果
    # 一种是加密后的16进制的32长度的字符串
    print(md5.hexdigest())
    # 一种是二进制数据
    print(md5.digest())
    return md5.hexdigest()
​
​
def save_data(data):
    with open('user_data.json', 'w') as fp:
        json.dump(obj=data, fp=fp)
​
​
def read_data():
    with open('user_data.json', 'r') as fp:
        data = json.load(fp=fp)
​
    return data
​
​
def get_username_password():
    username = input("username :>>>> ").strip()
    password = input("password :>>>> ").strip()
    return username, password
​
​
def encrypt_password(password, salt):
    data = password + salt
    data = data.encode()
    md5 = hashlib.md5()
    md5.update(data)
    return md5.hexdigest()
​
​
def register():
    username, password = get_username_password()
    print(password)
    salt = get_v_code(6)
    password = encrypt_password(password, salt)
    save_data({'username': username, "password": password, 'salt': salt})
​
​
def login():
    username, password = get_username_password()
    user_data_dict = read_data()
    print(password)
    salt = user_data_dict['salt']
    password = encrypt_password(password, salt)
    if username == user_data_dict['username'] and password == user_data_dict['password']:
        print(f"登录成功!")
    else:
        print("登录失败")
​
​
register()
login()
​
​
# knight
# 123456
# 返回
# 123456
相关推荐
七夜zippoe20 分钟前
Dask:超越内存限制的并行计算——从任务图到分布式调度的实战指南
python·集群·task·array·dataframe·dask
serve the people22 分钟前
python环境搭建 (五) Dockerfile 和 docker-compose.yml 核心作用
java·python·docker
维构lbs智能定位1 小时前
工厂人员定位(一)融合定位技术如何重构安全生产与效率管理?(含系统架构、技术选型对比、实际应用)
python·物联网·智慧工厂·厂区人员定位系统·工厂人员定位·工厂定位系统
yufuu981 小时前
进阶技巧与底层原理
jvm·数据库·python
2301_817497331 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
Warren981 小时前
Allure 常用装饰器:实战用法 + 最佳实践(接口自动化)
运维·服务器·git·python·单元测试·自动化·pytest
2401_841495641 小时前
【LeetCode刷题】翻转二叉树
python·算法·leetcode··递归·节点·翻转二叉树
森爱。1 小时前
web开发全家桶(django+前端+数据库)
前端·python·django
七夜zippoe1 小时前
数据可视化高级技巧:Matplotlib + Seaborn实战大全
python·信息可视化·matplotlib·数据可视化·seaborn·gridspec
郝学胜-神的一滴1 小时前
线性判别分析(LDA)原理详解与实战应用
人工智能·python·程序人生·算法·机器学习·数据挖掘·sklearn