¥hashlib模块¥

hashlib模块

  • 摘要算法:只能加密不能解密

  • 加密算法:用方法加密,加密后的字符串可以解密

【一】摘要算法

  • Python的hashlib提供了常见的摘要算法

    • 如MD5,SHA1

  • 摘要算法又称哈希算法、散列算法。

  • 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

  • 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest

  • 目的是为了发现原始数据是否被人篡改过。

  • 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数

  • 计算f(data)很容易,但通过digest反推data却非常困难。

  • 而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

import hashlib

【二】基础

import hashlib
import json
​
​
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())  
   #a9824cf2cad8240003dd8071a4b315d3
    # 一种是二进制数据
    print(md5.digest())
#b'\xa9\x82L\xf2\xca\xd8$\x00\x03\xdd\x80q\xa4\xb3\x15\xd3'
    # 把常见的这种字符 用md5加密 ---> 扔到数据库里面
    # 数据库中查 又返回
    return md5.hexdigest()
  • md5只能对二进制数据进行加密

【三】加盐

  • 如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。

  • 此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

  • 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要

  • 由于常用口令的MD5值很容易被计算出来

    • 所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5

    • 这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”

import random
​
​
def get_verify_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_verify_code(6)
    # 给原始数据
    data = 'my name is dream'
    # data = data + code
    # data = code + data
    # 转成二进制数据
    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())  # c4ca4238a0b923820dcc509a6f75849b
    # 一种是二进制数据
    print(md5.digest())
​
    # 把常见的这种字符 用md5加密 ---> 扔到数据库里面
    # 数据库中查 又返回
​
    return md5.hexdigest()
​
​
'''
one = one()
two = two()
print(one)  # a9824cf2cad8240003dd8071a4b315d3
print(two)
# 78e3b0d87878746c81a6aee148139459
# c0cd81c3993a68867f1ebeeb7e0b2535
# df200c13893926f399290212fbf8dc26
# b44c1a5212b71ee2bde885dfd8e0484e
'''
  • chr将对应的ASRII表转换成对应的数据

【四】案例

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_verify_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()

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值