hashlib 模块
hashlib模块可用于对密码的加密破解有撞库暴力破解,
在进行动态加盐后撞库的可能性就基本没有了。
# import hashlib#打开模块 # m = hashlib.md5()#创建了一个md5算法的对象 # m.update('123456'.encode('utf-8')) # print(m.hexdigest())#在pycharm中hexdigest没提示 #输出结果e10adc3949ba59abbe56e057f20f883e #加密后的字符串永远不会变 # 加盐 # m = hashlib.md5(b'bilibili')#创建一个MD5的对象 # m.update('123456'.encode('utf-8')) # print(m.hexdigest()) # 输出结果500785fe24e0dec0e5a981a8597085b2 # 动态加盐 #以自己的用户名加盐 # user = b'bilibili' # m = hashlib.md5(user[::-1]) # 创建了一个md5算法的对象 # m.update('123456'.encode('utf-8')) # print(m.hexdigest())
文件的一致性
在网络传输时文件的一致性必须保证否则就会出大问题。
利用hashlib查看是就算有一个字符的不一样也会让最后的结果不一样
# 文件的一致性 # md5obj = hashlib.md5() # md5obj.update(b'wahaha,heng,haohao') # md5obj.update(b'wahaha,') # md5obj.update(b'heng,') # md5obj.update(b'haohao') # print(md5obj.hexdigest()) # 4194deb809d4862a84309984330ecac0 # 4194deb809d4862a84309984330ecac0 # 一段字符串直接进行摘要和分成几段摘要的结果是相同的 # import hashlib # def check(filename):#定义一个函数 # md5obj=hashlib.md5 # with open(filename,'rb')as f: # while True:#循环读取 每次1024字节 # # content = f.read(1024) # if content: # md5obj.update(content) # else: # break # return md5obj.hexdigest()#返回加密后的密文 # ret1=check('king1') # ret2=check('king2')#导入两个文件 # print(ret1) # print(ret2)#对比
序列化 把数据类型变成字符串
为什么要有序列化 因为在网络上和文件中能存在的只有字节
json 在所有语言中通用 只对有限的数据类型进行序列化 字典 列表 字符串 数字 元组
在多次写入dump数据进入文件的时候,不能通过load来取。
pickle 只能在python中使用 对绝大多数数据类型都可以进行序列化
在load的时候,必须拥有被load数据类型对应的类在内存里
dumps 序列化
loads 反序列化
dump 直接向文件中序列化
load 直接对文件反序列化
shelve
模块configparser
操作configparser模块与操作字典类似
# import configparser # config = configparser.ConfigParser() # config.read('example.ini') # print(config.sections()) # .sections()查看所有的节 但是默认不显示DEFAULT [] # print('bitbucket.org' in config) # True in config验证某个节是否在文件中 # print('bytebong.com' in config) # False # print(config['bitbucket.org']["user"]) # hg 查看某节下面的某个配置项的值 # print(config['DEFAULT']['Compression']) #yes # print(config['topsecret.server.com']['ForwardX11']) #no # print(config['bitbucket.org']) #<Section: bitbucket.org> # for key in config['bitbucket.org']: # 注意,有default会默认default的键 # print(key) # print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键 # print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对 # print(config.get('bitbucket.org','compression')) # yes get方法Section下的key对应的value
特殊的增加与删除
#添加与删除 import configparser # config = configparser.ConfigParser() # config.read('example.ini') # config.add_section('yuan')#新建分支 # config.remove_section('bitbucket.org')#删除分支 # config.remove_option('topsecret.server.com',"forwardx11")#删除分支下的属性 # config.set('topsecret.server.com','k1','11111')#给分支添加属性 # config.set('yuan','k2','22222') # config.write(open('new2.ini', "w"))
logging模块
logging模块 不会自动帮你添加日志的内容
# logging
# 简单配置
# 配置logger对象
# 简单配置
# import logging # # 默认情况下 只显示 警告 及警告级别以上信息 # logging.basicConfig(level=logging.DEBUG, # format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # datefmt='%a, %d %b %y %H:%M:%S',#时间格式 # # filename = 'userinfo.log'#已文件的形式文件,注掉后已屏幕显示 # ) # logging.debug('debug message') # debug 调试模式 级别最低 # logging.info('info message') # info 显示正常信息 # logging.warning('warning message') # warning 显示警告信息 # logging.error('error message') # error 显示错误信息 # logging.critical('critical message') # critical 显示严重错误信息 # 编码格式不能设置 # 不能同时输出到文件 和 屏幕
配置logger对象
#配置 logging # import logging # logger = logging.getLogger()#实例化 # fh = logging.FileHandler('test.log',encoding='utf-8')#实例化一个文件句柄fh # sh = logging.StreamHandler()#实例化一个对象sh # #格式 # fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # fh.setFormatter(fmt) #格式和文件句柄或屏幕句柄关联 # sh.setFormatter(fmt) # sh.setLevel(logging.WARNING) # #将sh 和 fh 拿来用 # logger.addHandler(fh) # logger.addHandler(sh) # logger.setLevel(logging.DEBUG) # # logger.debug('debug message') # debug 调试模式 级别最低 # logger.info('info message') # info 显示正常信息 # logger.warning('warning message') # warning 显示警告信息 # logger.error('error message') # error 显示错误信息 # logger.critical('critical message')#严重错误 # logging # logging 是记录日志的模块
# 它不能自己打印内容 只能根据程序员写的代码来完成功能
# logging模块提供5中日志级别,从低到高一次:debug info warning error critical
# 默认从warning模式开始显示
# 只显示一些基础信息,我们还可以对显示的格式做一些配置
# 简单配置 配置格式 basicCondfig
# 问题:编码问题,不能同时输出到文件和屏幕
# logger对象配置
# 高可定制化
# 首先创造logger对象
# 创造文件句柄 屏幕句柄
# 创造格式
# 使用文件句柄和屏幕句柄 绑定格式
# logger对象和句柄关联
# logger.setLevel
# 使用的时候 logger.debug
# from collections import namedtuple
# Point = namedtuple('Point',['x','y'])
# p = Point(1,2)
# p = Point(1,2)
# print(p)
# print(p.x)
# print(p.y)
# from collections import deque
# 双端队列
# dq = deque()
# dq.append(1)
# dq.append(2)
# dq.append(3)
# print(dq)
# print(dq.pop())
# print(dq.popleft())
# dq.appendleft(4)
# dq.appendleft(5)
# print(dq)
import queue
# 队列 先进先出 fifo
# 计算机数据结构模型
# 先进先出
# 栈 先进后出
# 计算机数据结构模型
# 先进先出
# dic = {'k1':'v1','k2':'v1','k3':'v1','k4':'v1'} # keys = list(dic.keys()) # print(keys) # for k in keys: # print(k,dic[k]) # from collections import OrderedDict # # dic = dict([('k1','v1'),('k2','v2')]) # # print(dic) # # dic = OrderedDict([('k1','v1'),('k2','v2')]) # print(dic) #打开模块 # def check(filename):#定义一个函数 # md5obj=hashlib.md5 # with open(filename,'rb')as f: # while True:#循环读取 每次1024字节 # # content = f.read(1024) # if content: # md5obj.update(content) # else: # break # return md5obj.hexdigest()#返回加密后的密文 # ret1=check('king1') # ret2=check('king2')#导入两个文件 # print(ret1) # print(ret2)#对比 import hashlib def king(wenjian): objmd5=hashlib.md5() with open(wenjian,'rb')as f: while True: content = f.read(1024) if content: objmd5.update(content) else: break return objmd5.hexdigest() a1=king('test.log') a2=king('userinfo.log') print(a1) print(a2) print(a1==a2)