day 22 常用模块二
大纲
常用模块二
hashlib模块
configparse
logging
项目开发规范
1.常用模块二
01.hashlib的特点:
用sha算法加密如下
import hashlib sha_obj = hashlib.sha1() sha_obj.update(b'alex3714') print(sha_obj.hexdigest()) 结果: 8a003668a9c990f15148f9e4046e1410781533b6
用md5算法加密如下:
import hashlib md5_obj = hashlib.md5() md5_obj.update(b'alex3714') print(md5_obj.hexdigest()) 结果: aee949757a2e698417463d47acac93df
hashlib共计两种加密方法,MD5及SHA1算法
是一个模块,提供队中i功能算法
同一个字符串用同一个算法进行价目,结果总是相同的
同一个字符串用不同的算法进行加密,结果总是不同的
那为什么要使用hashlib进行加密呢?
02.登录
#用于加密 import hashlib md5_obj=hashlib.md5() md5_obj.update(b'alex1234') print(md5_obj.hexdigest()) 结果: b8b28fcfe009057f2ef7362b1e91fe7a
import hashlib
user = input('username : ') pwd = input('password : ') md5_obj = hashlib.md5() md5_obj.update(pwd.encode('utf-8')) str_md5 = md5_obj.hexdigest()
print(str_md5) #将打印出来的密码的加密版复制到 ‘userinfo’文件中 with open('userinfo',encoding='utf-8') as f: for line in f: name,passwd = line.split('|') if name == user and str_md5 == passwd:#文件中加密版密码和输入密码的临时加密版进行比较 print('登录成功') break
将dj080000转化,转化之后的结果存储在文件里
登录时:输入密码,用同样的方法转化,将结果与文件中的进行匹配
import hashlib ----hashlib.md5----hashlib,sha
03.md5算法:暴力破解,撞库
04.md5第二个功能
校验文件的一致性:md5 速度快
如果一个文件的size比较大 8个g
md5_obj = hashlib.md5() md5_obj.update(b'alex') md5_obj.update(b'3714') str_md5 = md5_obj.hexdigest() print(str_md5) import os with open(r'E:\python S12全期笔记\day 22\hashlib算法.py',encoding='utf-8') as f: file_size = os.path.getsize(r'E:\python S12全期笔记\day 22\hashlib算法.py') md5_obj = hashlib.md5() while file_size > 0: str_content = f.read(1024) md5_obj.update(str_content.encode('utf-8')) file_size -= 1024 print(md5_obj.hexdigest()) 结果: aee949757a2e698417463d47acac93df bb6c9e92e90252c36a7bca547ef64384
05.sha算法:是一个算法集,随着后边数字越大,计算的时间越长,结果越长越安全
动态加盐:每一个用户的密码的密文的
#格式:hashlib.md5("salt".encode("utf8"))
第二行里边的‘盐’,可以改成任意字符,为了防止密码被篡改! import hashlib md5_obj=hashlib.md5('盐'.encode('utf-8')) md5_obj.update(b'123456') print(md5_obj.hexdigest()) 结果: 970d52d48082f3fb0c59d5611d25ec1e
#首先先创建一个'pwd.txt'文件,里边写入用户名、密码的md5值,中间使用 ‘|’连接!!
#注意:username 也可以做盐! username = input('username: ') password = input('password: ') md5_obj = hashlib.md5('糖'.encode('utf-8')) md5_obj.update(password.encode('utf-8')) md5_str = md5_obj.hexdigest() with open('pwd.txt') as f: for line in f: name,pwd = line.split('|') if name == username and pwd == md5_str: print('登录成功') break 结果: 输入:dj 在输入密码 123456 登陆成功!
06 动态加盐,加密比较厉害,动态加盐的摘要算法 ----完美
#动态加盐 主要就是将username作为‘盐’,这样就比较保险!
#首先要获取密码的 加密值,运行程序,输入用户名即密码,出现加密密码
username: 杜举飞
password: 123456
6e40d83cf7dd6513b8d8f8d8d998e57d
#再将加密的密码复制到文件‘userinfo’中,再次登录,结果如下:
username: dujufei
password: 123456
b1b7100361750d15189aa4a1a6724dce
#程序如下:
import hashlib username = input('username: ') password = input('password: ') md5_obj = hashlib.md5(username.encode('utf-8')) md5_obj.update(password.encode('utf-8')) str_md5 = md5_obj.hexdigest() print(str_md5) with open('userinfo'encoding='utf-8') as f:
for line in f:
name,pwd = line.split('|')
if name == username and pwd == str_md5:
print('登录成功')
break
2.configparse
3.logging
3.1函数简单配置
‘’日志‘’(日本林志玲)级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG,默认只打印大于等于warning级别的。
import logging logging.debug('debug message') # 调试的时候 logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') # 批判的 结果: WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message
3.2.basicConfig
#显示debug以上的信息!!
import logging 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') # 批判的 结果:
DEBUG:root:debug message
INFO:root:info message
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
import logging 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') # 批判的 结果 2018-05-29 20:12:17,835 4.logging模块.py[line:29] DEBUG debug message 2018-05-29 20:12:17,842 4.logging模块.py[line:30] INFO info message 2018-05-29 20:12:17,842 4.logging模块.py[line:31] WARNING warning message 2018-05-29 20:12:17,843 4.logging模块.py[line:32] ERROR error message 2018-05-29 20:12:17,843 4.logging模块.py[line:33] CRITICAL critical message
3.3 getlogging
getlogging和basicConfig的区别就是getlogging是操作一个对象!上边的basicConfig直接进行操作!
import logging logger=logging.getLogger()
import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件,会将你写的日志打印到这个日志里边! fh = logging.FileHandler('test.log',encoding='utf-8') # 再创建一个handler,用于输出到控制台 ,在python里显示的就是下下边这行这种格式! ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')
4.项目开发规范
浙公网安备 33010602011771号