首页 > 其他分享 >hashlib+time模块

hashlib+time模块

时间:2023-12-17 15:12:59浏览次数:41  
标签:hashlib 元组 tm 模块 time 口令 data md5

hashlib模块

【一】什么是摘要算法

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

【二】摘要算法(md5)

【1】加密数据

(1)一次性加密(同一段数据)

  • 以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib

md5 = hashlib.md5()

a = 'heart'
a = a.encode('utf8')
md5.update(a)
print(md5.hexdigest())  # 3189934774aa880fa7fbf8da8f9e446d

(2)分次加密(同一段数据)

  • 如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的
  • MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
import hashlib

md5 = hashlib.md5()

a = 'hello'
b = 'heart'
a = a.encode('utf8')
b = b.encode('utf8')
md5.update(a)
md5.update(b)
print(md5.hexdigest())  # 9f20a78a71e4e0f02166684e9f8aa4b2

【2】获取加密数据

from hashlib import md5

# 这里是字符串类型
data = '哈特'
md5_obj = md5()
data = data.encode('utf-8')
md5_obj.update(data)
# 拿到加密字符串 # 二进制的结果
print(md5_obj.digest())  # b"79\x1fu\xb9-t\xd2F,R'\xb6G\x8cG"
# 拿到加密字符串 # 十六进制的结果
print(md5_obj.hexdigest())  # 37391f75b92d74d2462c5227b6478c47

【三】摘要算法升级之加盐

  • 任何允许用户登录的网站都会存储用户登录的用户名和口令。
  • 如何存储用户名和口令呢?
    • 方法是存到数据库表中:
name    | password
--------+----------
michael | 123456
bob     | abc999
alice   | alice2008
  • 如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。
  • 此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。
  • 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:
username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153
alice    | 99b1c2188db85afee403b1536010c2c9
  • 考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令
  • 于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:
'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'
  • 这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。
  • 对于用户来讲,当然不要使用过于简单的口令。
    • 但是,我们能否在程序设计上对简单口令加强保护呢?
  • 由于常用口令的MD5值很容易被计算出来
    • 所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5
    • 这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
hashlib.md5("salt".encode("utf8"))
  • 经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。
  • 但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。
    • 有没有办法让使用相同口令的用户存储不同的MD5呢?
  • 如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。
  • 摘要算法在很多地方都有广泛的应用。
    • 要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

摘要算法加密的特点是 : 相同的数据加密出来的加密串是一样的,不同的数据的加密串肯定是不一样的
每个网站都会有一个数据库 : 数据库里面存了这些密码的加密串
破解方法:撞库

防止撞库的破解方法 --->>加盐

md5_one = hashlib.md5()

data = '123456'
# data += '888' # 这个方法加盐和定义完盐再update 结果是一样的
# 96f1fe34e2cb267a5c8f76653f424ebb 
data = data.encode('utf8')
salt = '888'
salt = salt.encode('utf8')
md5_one.update(data)
md5_one.update(salt)

print(md5_one.hexdigest()) # 96f1fe34e2cb267a5c8f76653f424ebb

【四】摘要算法模版

import hashlib

def get_md5_digest(salt,data):
    data = salt + data
    b_data = data.encode('utf-8')
    encrypted_data = hashlib.md5(b_data)

    return encrypted_data.hexdigest()

【五】注册登录里加密加盐

import random
import hashlib
import json
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 create_has(data,salt):
    data = str(data) +str(salt)
    data = data.encode('utf8')
    data1=hashlib.md5()
    data1.update(data)
    aa = data1.hexdigest()
    return aa

def save_data(data):
    with open('user_pwd.json','a',encoding='utf-8')as f:
        json.dump(data,f,ensure_ascii=False)

def register():
    username =input('请输入用户名:>>>').strip()
    password = input('请输入密码:>>>').strip()
    #注册的时候输入六位验证码
    yzm = get_verify_code(6)
    yanzhengma = input(f'请输入六位验证码 {yzm}:>>>').strip()
    if yzm.upper() != yanzhengma.upper():
        print('验证码错误!')
    # 加密密码时需要的盐
    salt = get_verify_code(4)
    password = create_has(data=password,salt=salt)
    user_data = {username:{'username':username,'password':password,'salt':salt}}
    save_data(data=user_data)
    print(user_data) # {'username': 'heart', 'password': 'aa3b6ce685c5279b6a5a5c3d296bfb53', 'salt': 'c802'}


# register()
def read_data():
    with open('user_pwd.json','r',encoding='utf-8')as f:
        data = json.load(f)
    return data

def login():
    username =input('请输入用户名:>>>').strip()
    password = input('请输入密码:>>>').strip()
    data =read_data()
    user_data = data.get(username)
    salt = user_data.get('salt')
    password = create_has(data=password,salt=salt)
    if password == user_data.get('password'):
        print('登陆成功!')
    else:
        print('密码不对!')

login()

time模块

【需要记住的】
时间戳 :time.time()
时间元组 : time.localtime()
格式化输出时间 : time.strftime(format,时间元组)
指定日期和时间转换为时间元组 : time.strptime(自定义时间,时间格式)

【一】时间戳time.time()

  • time.time() 是time模块中的一个函数,用于获取当前时间戳,返回自纪元(Epoch)以来的秒数,通常是一个浮点数。
  • 这个函数在很多情况下都很有用,例如在性能测试、计时等需要测量时间的场景中。请注意,由于时间戳是以秒为单位的浮点数,可以通过差值计算时间间隔,或者转换为日期时间格式以便更容易阅读。
import time

current_time = time.time()
print("当前时间戳:", current_time) # 当前时间戳: 1702795955.0250285

【二】时间元组time.localtime()

  • time.localtime() 是 time 模块中的一个函数,用于将一个时间戳(秒数)转换为本地时间的结构化表示。它返回一个包含年、月、日等时间信息的元组。
  • 以下是 time.localtime() 的简要介绍:
import time

current_time = time.time()
local_time = time.localtime(current_time)

print("当前时间戳:", current_time)  # 当前时间戳: 1702796027.7515643
print("本地时间结构:", local_time)
# 本地时间结构: time.struct_time(tm_year=2023, tm_mon=12, tm_mday=17, tm_hour=14, tm_min=53, tm_sec=47, tm_wday=6, tm_yday=351, tm_isdst=0)

【三】格式化输出时间time.strftime(format,时间元组)

  • time.strftime(format, 时间元组) 是time模块中的一个函数,用于将时间元组格式化为字符串。它接受两个参数:format 是格式化字符串,用于定义输出的时间格式,而 时间元组 是包含时间信息的元组对象。

  • 以下是 time.strftime() 的简要介绍:

import time

# 获取当前时间的时间元组
local_time_tuple = time.localtime()

# 格式化时间元组为字符串
formatted_time = time.strftime("%Y-%m-%d %X", local_time_tuple)

print("本地时间元组:", local_time_tuple)
# 本地时间元组: time.struct_time(tm_year=2023, tm_mon=12, tm_mday=17, tm_hour=14, tm_min=55, tm_sec=35, tm_wday=6, tm_yday=351, tm_isdst=0)
print("格式化时间字符串:", formatted_time)
# 格式化时间字符串: 2023-12-17 14:55:35

【四】指定日期和时间转换为时间元组time.strptime(自定义时间,时间格式)

  • time.strptime(自定义时间, 时间格式) 是 time模块中的一个函数,用于将指定格式的日期和时间字符串解析为时间元组。这个函数的作用是与 time.strftime() 相反,后者是将时间元组格式化为字符串,而 time.strptime() 是将字符串解析为时间元组。

  • 以下是 time.strptime() 的简要介绍:

import time

# 将自定义时间字符串解析为时间元组
time_tuple = time.strptime("2023-01-01 12:30:45","%Y-%m-%d %X")

print("解析后的时间元组:", time_tuple)
# 解析后的时间元组: time.struct_time(tm_year=2023, tm_mon=1, tm_mday=1, tm_hour=12, tm_min=30, tm_sec=45, tm_wday=6, tm_yday=1, tm_isdst=-1)

标签:hashlib,元组,tm,模块,time,口令,data,md5
From: https://www.cnblogs.com/ssrheart/p/17909099.html

相关文章

  • random模块
    random模块【一】导入模块importrandom【二】随机小数(1)默认区间的小数(random)importrandom#默认是大于0且小于1之间的小数num=random.random()print(num)#0.50082157211298(2)指定区间的小数(uniform)importrandom#指定为0到5之间的随机小数res=random.u......
  • setTimeout是如何实现的
    setTimeout就是一个定时器,用来指定某个函数在多少毫秒之后执行。它会返回一个整数,表示定时器的编号,同时你还可以通过该编号来取消这个定时器。要了解定时器的工作原理,就得先来回顾下之前讲的事件循环系统,我们知道渲染进程中所有运行在主线程上的任务都需要先添加到消息队列,然后事件......
  • 【Web攻防之业务安全实战指南】第8章 回退模块测试
    8.1回退测试8.1.1测试原理和方法很多Web业务在密码修改成功后或者订单付款成功后等业务模块,在返回上一步重新修改密码或者重新付款时存在重新设置密码或者付款的功能,这时如果能返回上一步重复操作,而且还能更改或者重置结果,则存在业务回退漏洞。8.1.2测试过程靶场:8_1.zip首先......
  • 模块
    【一】random(随机数模块)random模块是Python中用于生成随机数的一个标准库模块。它提供了各种生成随机数的函数和方法,可以用于生成随机数、随机选择、随机排列等。通过使用random模块,你可以在Python程序中实现随机性和不确定性,以及进行各种随机相关的操作。例如,可以使用random模块......
  • 【Web攻防之业务安全实战指南】第6章 业务授权访问模块
    6.1非授权访问测试6.1.1测试原理和方法非授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访问成功。6.1.2测试过程靶......
  • Prime Time-02
    TimingConstrainclk3和clk4-异步clk2和clk1-同步有四个clk,所以要设置四个clk的周期latency-Netdelay,走线的延时uncertainty-clkskew和clkjitter和毛刺transition-时钟跳变的时间falsepath-PT虽然穷举了所有的path,但是并不是所有的path都需要进行......
  • Python高级之模块导入
    模块导入与包的使用【一】模块与包概要模块(Module):定义:在Python中,模块是一个包含Python代码的文件。这些文件以.py为扩展名,可以包含变量、函数和类等,文件名为xxx.py,模块名则是xxx,导入模块可以引用模块中已经写好的功能。作用:模块提供了一种组织代码的方式,将相关的功......
  • Prime Time - 介绍
    PrimeTime是对timing进行分析PrimeTime使用的是STA方法进行分析工具会有更新,但是核心内容是不变的PrimeTime(introtoSTA)没有PT工具的时候,checktiming需要对于门级电路进行仿真,耗时时间长PT用于静态时序分析的工具PT工作在门级电路上静态时序分析......
  • os模块
    os模块【一】文件操作(1)导入模块importos(2)获取当前文件路径(abspath)abspathfile_path=os.path.abspath(__file__)(3)获取当前文件所在文件夹的路径(dirname)dirnamebase_dir=os.path.dirname(__file__)(4)判断当前路径是否存在(exists)#指定一个存在的路径path_one......
  • random模块
    random模块【一】导入模块importrandom【二】随机小数(1)默认区间的小数(random)importrandom#默认是大于0且小于1之间的小数num=random.random()print(num)#0.50082157211298(2)指定区间的小数(uniform)importrandom#指定为0到5之间的随机小数res=random.u......