hashlib+time模块
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+time模块的更多相关文章
- day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
# 多态的理解:# Python 天生自带多态# 鸭子类型 list 和 tuple 就是一对鸭子类型 很像但是没有继承关系## 而其他的类型 上传参数或者打印参数的时候 必须是指定的数据类型# -- ...
- 加密模块hashlib+日志模块logging
目录 1.hashlib 加密模块 1.hashlib模块基本使用 1.2 详细操作 ①md5加密模式 ②sha256复杂加密模式 ③加盐操作(普通加盐) ④加盐操作(动态加盐) 2.logging ...
- python学习道路(day6note)(time &datetime,random,shutil,shelve,xml处理,configparser,hashlib,logging模块,re正则表达式)
1.tiim模块,因为方法较多我就写在code里面了,后面有注释 #!/usr/bin/env python #_*_coding:utf-8_*_ print("time".ce ...
- 第二十二天 logging hashlib re 模块
今日内容 logging功能完善的日志模块 re正则表达式模块主要处理字符串匹配 查找 搜索给你一个字符串 要从中找到你需要的东西 爬虫大量使用 hashlib hash算法相关的库 算法怎么算不需要 ...
- (常用)configparser,hashlib,hamc模块
configparser模块 #专门解析my.ini这种形式的文件(cnf) import configparser config=configparser.ConfigParser() conf ...
- python自学第13天 hashlib,re模块
import hashlib sha=hashlib.sha3_512()#定义加密成什么格式 sha.update('how to use sha1 in 年后 '.encode('utf-8')) ...
- Python hashlib&hmac 模块
用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 hashlib模块示例: import hashlib m = hashlib. ...
- hashlib configparser模块
算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常 ...
- Python【sys】模块和【hashlib】模块
import sysimport osprint(sys.platform) #判断操作系统,windows10输出win32print("sys.path:",sys.path) ...
- hashlib摘要算法模块,logging日志,configparser配置文件模块
一.hashlib模块(摘要算法模块) 1.算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把 ...
随机推荐
- kvm内存优化--KSM
一.KSM(Kernel SamePage Merging) 1.KSM简介 KSM允许内核在多个进程(包括虚拟机)之间共享完全相同的内存页,KSM让内核扫描检查正在运行中的程序并且比较他们的内存,若 ...
- 解决Linux下文本文件中文乱码问题
上一篇我们提到了OS和DB的一些中文乱码问题解决,本篇我们继续介绍下在OS上的文本文件中文乱码问题. 操作系统是Linux(OEL 8.10),所有文件是打了一个压缩包上传的,上传解压后发现其中的文本 ...
- 【网络协议】深入理解HTTP协议
# 协议 协议就是一种双方提前约定好采用某种形式,以某种规格,利用某种物体把数据传输出去:而另一方再以同样的规则和流程去接收数据的约定制度或者规章. 现代网络是由多种运行在不同平台上的异构系统组成的. ...
- shared_ptr的线程安全性与再论cmu15445 project0的COW线程安全字典树
shared_ptr的线程安全性 近期在网上冲浪时看到一篇boost的文章,里面聊到了shared_ptr的线程安全性 https://www.boost.org/doc/libs/1_87_0/li ...
- 第10章面向对象编程(高级部分)-cnblog
类变量与类方法 static修饰的成员变量(类变量,静态变量)的特性? 同一个类所有对象共享 类变量是随着类的加载而创建, 所以即使没有创建对象实例也可以访问 ,但是类变量的访问, 必须遵守 相关的访 ...
- Oracle return exit continue
常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...
- 记一次 .NET某云HIS系统 CPU爆高分析
一:背景 1. 讲故事 年前有位朋友找到我,说他们的系统会偶发性的CPU爆高,有时候是爆高几十秒,有时候高达一分多钟,自己有一点分析基础,但还是没找到原因,让我帮忙看下怎么回事? 二:CPU爆高分析 ...
- 详细介绍Mybatis的缓存机制
一.缓存机制 1.缓存概述 缓存:缓存就是一块内存空间,保存临时数据 作用:将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取时直接从缓存中获取,可以减少和数据库交互的次数,提升程序的性 ...
- 如何对 Java 的垃圾回收进行调优?
如何对 Java 的垃圾回收进行调优? Java 垃圾回收的调优涉及多个方面,从选择合适的垃圾回收器到调整堆内存的大小.配置 GC 参数等,下面是一些常见的调优方法: 1. 选择合适的垃圾回收器 不同 ...
- apache配置symfony并隐藏入口文件app.php
------------------------------- 参考: 配置Web服务器 apache url路由配置重写 Apache URL重写规则(详解) symfony官网文档 ------- ...