day25模块 hashlib configparser logging
Posted fengkun125
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day25模块 hashlib configparser logging相关的知识,希望对你有一定的参考价值。
今日内容
json 补充
3.1 hashlib 加密,摘要算法
3.2 configparser 配置文件
3.3 logging 模块
json字符串和python 字符串到底差在什么地方?
json字符串在数据最外面始终是单引号引起来的.
json字符串如果数据是容器类的数据类型,且里面有字符串,字符串一定是双引号引起来的.
而python "{‘alex‘:‘wusir‘}" 不区分单双引号.
对于单独的字符串:
python显示: "alex" 不区分单双引号
json显示: ‘ "alex" ‘ 外面还有一个单引号
3.1 hashlib:hash:算法,结果是内存地址.
hashlib 模块与加密相关,实际上他是摘要算法.
1. hashlib 是一堆算法的合集,它包含很多算法(加密的).
2.hashlib 的过程就是将字符串转化成 一串由数字和字母组合的字符串的过程.(经过hashlib转化的结果是等长的)
3.hashlib对相同的字符串转化成的()数字加字母)是相同的
4. 不同的电脑对相同的字符串进行加密,转化成的数字相同.
hashlib 用在哪里?
1.密文(密码):将密码用算法加密放置到数据库.每次取出验证.
2. 文件的校验
初识 hashlib
import hashlib
#md5 加密算法, 常用算法,可以满足一般的常用需求.
#sha 1(有好几个等级) : 加密算法,级别高一些,数字越大级别越高,加密的效率越低,越安全.
#md5
s = "123456"
ret = hashlib.md5() #创建一个md5对象
ret.update(s.encode("utf-8")) #调用次update方法对参数进行加密bytes类型
print(ret.hexdigest()) #得到加密后的结果 定长
s2 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajld"
ret = hashlib.md5() #创建一个md5对象
ret.update(s2.encode("utf-8")) #调用次update方法对参数进行加密bytes类型
print(ret.hexdigest()) #得到加密后的结果 定长
s3 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajle"
ret = hashlib.md5() #创建一个md5对象
ret.update(s3.encode("utf-8")) #调用次update方法对参数进行加密 bytes类型
print(ret.hexdigest()) #得到加密后的结果 定长
s2 和s3就只有一个字母不一样,得到加密后的结果也是大不一样.
无论字符串多长,返回都是定长的(数字和字符串)
同一字符串,md5值相同.
黑客:将你常用的密码 000000 111111 等.对应的md5关系表给打印出来,因此就会有可能破解密码.
撞库:因为撞库,所以相对不安全,如何解决?
import hashlib
s = "123456"
ret = hashlib.md5()
ret.update(s.encode("utf-8")
print(ret.hexdigest())
解决方式:加盐
s1 = "123456"
ret = hashlib.md5("&&%%$".encode("utf-8")) #创建一个md5对象,加盐
ret.update(s1.encode("utf-8")) #调用此update方法对参数进行加密bytes类型
print(ret.hexdigest()) #得到加密后的结果 定长
如果黑客盗取到固定的盐,"&&%%$"内容,还是会破解密码
变成随机的盐:
import hashlib
username= "ajdklfja"
password = "123456"
ret = hashlip.md5(username[::-2].encode("utf-8"))
ret.update(password.encode("utf-8"))
print(ret.hexdigest())
sha 系列
hashlib.sha1() #sha1与md5级别相同,但是sha1比md5更安全一些,因为sha1用得少.
import hashlib
ret = hashlib.sha1()
ret.update("122345".encode("utf-8"))
print(ret.hexdigest())
ret = hashlib.sha512() #级别最高,效率低,安全性最大
ret.update("123456".encode("utf-8"))
print(ret.hexdigest())
文件的校验:
def func(file_name):
with open(file_name,mode="rb")as f: #用rb模式,文件里的内容就不需要再编译成bytes类型了.
ret = hashlib.md5()
ret.update(f.read()) #因为文件使用rb模式打开的所以这里不用编译成bytes类型
return ret.hexdigest()
print(func("hashlib_file"))
print(func("hashlib_file"))
上面的代码对于小文件可以(f.read()是一次性读取文件)但是超大的文件,内存就受不了.
import hashlib
s = "我爱你中国,我是地球人.也是亚洲人,更是中国人"
ret = hashlib.md5()
ret.update(s.encode("utf-8"))
print(ret.hexdigest())
get = hashlib.md5()
get.update(s[0:10].encode("utf-8"))
get.update(s[10:].encode("utf-8"))
print(get.hexdigest())
两次打印的结果是一样的
def func(file_name):
with open(file_name,mode="rb")as f:
ret = hashlib.md5
#for i in f: #这个方法跟下面的方法得到的结果一样.
# ret.update(i)
#return ret.hexdigest()
while True:
content = f1.read(1024)
if content:
ret.update(content)
else:
break
return ret.hexdigest()
print(func("hashlib_file"))
print(func("hashlib_file"))
hashlib :用在密文(密码),或者文件的校验.
md5:普通的, 加盐的 , 动态加盐的
sha系列: 普通的 , 加盐的, 动态加盐的
文件的校验:小文件,大文件.
3.2 configparser (配置文件)(了解):放置一些常用的变量(以 .ini 结尾)
configparser 帮助操作(创建,增加,删,改,查)一个配置文件.
创建一个文件:
import configparser
config = configparser.ConfigParser()
config[‘DEFAULT‘] = {"ServerAliveInerval":"45",
‘Compression‘:"yes",
‘ComperssionLevel‘:"9",
‘ForwardXl1‘:‘yes‘
}
config[‘bitbucket.org‘] = {"user":"hg"}
config[‘topsecret.server.com‘] = {‘Host Port‘ : ‘45345‘,‘ForwardXl1‘ : ‘no‘}
with open("example.ini","w")as f:
config.write(f)
以上操作便是创建一个example.ini的配置文件
import configparser
config = configparser.ConfigParser()
查找内容,基于字典的形式.
print(config.sections()) #打印出 [] 空列表.
config.read("example.ini")#顺序:创建一个对象,然后将文件读到内存中,再进行相应的操作.
print(config.sections())#就会打印出文件的sections
#打印的结果为什么没有DEFAULT?因为他是特殊的,可以看做成一个全局的.
print("111" in config) #False
print("bitbucket.org" in config) #True
判断节名是否在配置文件中,上面的方法就是验证
对配置文件中的节对应的项取值
print(config["bitbucket.org"]["user"])#hg
print(config["DEFAULT"][‘Compression"])#yes
print(config["topsecret.server.com"]["ForwardXl1"])#no
print(config["bitubcket.org"])#输出的是一个可迭代器
print(config["bitbucket.org"]["forwardxl1"])#yes
for key in config[‘bitbucket.org‘]#注意有default会默认default的键,意思就是default也能打印出来
print(key)
print(config.options(‘bitbucket.org‘))#同for循环,找到"bitbucket.org"下所有的键
print(config.items("bitbucket.org"))#找到"bitbucket.org"下所有的键值对,包括DEFAULT下的
print(config.get("bitbucket.org","compression"))#yes get方法Section下的key对应的value
增删改
import configparser
config = configparser.ConfigParser()
config.read("new2.ini")
config.add_section("日天")
config.remove_section("bitbucket.org")
config.remove_option("topsecret.server.com‘‘,"forwardxl1")
config.set("topsecret.server.com","k1","1111")
config.set("yuan","k2","22222")
config.write(open("new2.ini","w")
log 日志:
什么时候用到日志?
生活中:
1.公司员工信息工号等等需要日志.
2.淘宝,京东 你的消费信息,浏览记录等等都记录日志中,个性化推荐.
3.头条个性化设置(爱好记录的日志中)
等等
工作上:
运维人员,任何员工对服务器做过的任何操作,都会记录到日志中.如果你要是从事运维开发的工作,各处都需要日志.
debug模式,需要依靠日志的,
定时收集信息,也要记录日志.
logging 模块是辅助你记录日志的,不是自动记录日志的.
低配版,logging
高配版,logger 对象
低配版,logging
import logging
等级是一层一层升高的.
logging.basicConfig(level=logging.DEBUG)
level = logging.DEBUG设置显示报错的级别
logging.debug("debug message") #调试信息
logging.info("info message")#正常信息
logging.warning("warning message")#警告信息:代码虽然不报错,但是警告写的不规范,必须改
logging.error("error message")#错误信息
logging.critical("critical message")#严重错误信息
用法实例:
try:
num = input("<<<<")
num = int(num)
except ValueError:
logging.error("出现了%s"%ValueError)
1.调整格式.(完善报错信息)
logging.basicConfig(level = logging.DEBUG,
format = "%(asctime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",
)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
logging.basicConfig(level= logging.DEBUG,
format = "%(astime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",
datefmt = "%a, %d %b %Y %H:%M:%S:, #设置时间格式
filename = "low_logging.log", #设置文件名
filemode = "w" #设置写入模式
)
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
try:
num = input("<<<<")
num = int(num)
except Exception as e:
logging.warning(e)
logging.error(e)
logging.critical(e)
低配版 logging 缺点:
1.写入文件打印日志不能同时进行
2.写入文件时文件编码方式为gbk
以上是关于day25模块 hashlib configparser logging的主要内容,如果未能解决你的问题,请参考以下文章
python学习道路(day6note)(time &datetime,random,shutil,shelve,xml处理,configparser,hashlib,logging模块,re