python 22 days

python 22 days

hashlib模块、configparser模块、logging模块

hash()

    把一个数据转换成一个数字的算法
    在同一次执行的过程中,
    对同一个可hash的值进行计算得出的结果总是相同的
做什么用的?
有什么特点?
基础数据类型的时候
    不可变数据类型可hash
    可变数据类型不可hash
 
print(hash('abc')) #-2148338516684256523
print(hash('abc'))
print(hash('abc'))
print(hash('abc'))
例题展示
-6430976884502984568
-6430976884502984568
-6430976884502984568
-6430976884502984568


结果是可变的
结果展示

字典
集合
在数据的存储方面提供优化的
为什么对同一个值计算hash值每次运行结果不同??
    由于每一次执行所获得的存储空间都不一定相同。
    所以多次执行统一代码得到的hash值可能不同

hashlib的模块:

hashlib的特点
是一个模块 ,提供多种算法
同一个字符串用同一种算法进行加密,结果总是相同的
同一个字符串用不同的算法进行加密,结果总是不同的
那为什么要使用hashlib进行加密呢?
1. 登录
    alex3714 --> 转换 --> 转换之后的结果储存在文件里
    # 用户登录的时候
    输入密码--> 用同样的方法转换 -->结果于文件中的匹配

import hashlib
hashlib.sha1()
md5算法 、sha算法
字符串 -->加密的结果
md5算法 —— 暴力破解,撞库
sha算法 —— 是一个算法集,
    随着后面的数字越大,计算的时间越长,结果越长,越安全

MD5的加密简单认证:

import hashlib

md5_obj = hashlib.md5()
md5_obj.update(b'alex3714')
print(md5_obj.hexdigest())
例题展示
aee949757a2e698417463d47acac93df
结果展示

简单登陆练习:

# 简单登录练习
user = input('username : ')
pwd = input('password : ')
md5_obj = hashlib.md5()
md5_obj.update(pwd.encode('utf-8'))
str_md5 = md5_obj.hexdigest()
with open('userinfo') as f:
    for line in f:
        name,passwd = line.split('|')
        if name == user and str_md5 == passwd:
            print('登录成功')
            break
例题展示

 sha算法:

sha_obj = hashlib.sha1()
sha_obj.update(b'alex3714')
print(sha_obj.hexdigest())
例题展示
8a003668a9c990f15148f9e4046e1410781533b6
结果展示

密码加盐:

import hashlib
md5_obj = hashlib.md5(''.encode('utf-8'))
md5_obj.update(b'123456')
print(md5_obj.hexdigest())
例题展示
ed174e8009ddb0c0182ada42a6b9a5cc
结果展示

密码加盐登陆练习:

import hashlib
password = input('password: ')
md5_obj = hashlib.md5(''.encode('utf-8'))
md5_obj.update(password.encode('utf-8'))
md5_str = md5_obj.hexdigest()
with open('userinfo') as f:
    for line in f:
        name,pwd = line.split('|')
        if name == username and pwd == md5_str:
            print('登录成功')
            break
例题展示

动态加盐:
每一个用户的密码的密文的盐都不一样
username做盐

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') as f:
    for line in f:
        name,pwd = line.split('|')
        if name == username and pwd == str_md5:
            print('登录成功')
            break
例题展示
username: ju
password: 123
3464368a2951e7dca08671b24bdc0b63
结果展示

md5第一个功能 —— 登录验证
md5算法和sha系列算法的用法
摘要算法的漏洞 —— 撞库
加盐的摘要算法 —— 恶意注册
动态加盐的摘要算法 —— 完美

MD5的第二个功能:

import hashlib
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'D:\12期作业文件\22day\22day.py',encoding='utf-8') as f:
    file_size = os.path.getsize(r'D:\12期作业文件\22day\22day.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
0632995331b223d43d7a1387656b39be
结果展示

configparser模块:

import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
                      'Compression': 'yes',
                     'CompressionLevel': '9',
                     'ForwardX11':'yes'
                     }
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as f:
   config.write(f)
例题展示

logging模块:

写日志的模块
在代码遇到问题的时候 —— 写给程序员看的
    一些中间结果起到的排错作用
    需要打印出来 —— 在排错的过程中
    在真正提供服务的时候 —— 不需要
记录一些用户的行为 —— 写给用户看的
                 —— 写给公司看的
记录一个字符串
写文件 print
logging模块???
    格式规范
    帮你把日志的紧急情况进行分类
 
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
结果展示

如果想调整日志信息显示情况,需要配置
基础配置basicConfig

logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
filename = 'test.log'        )
logging.debug('debug message')  # 调试的时候
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')  # 批判的
例题展示

使用logger对象的形式进行配置
import logging

import logging
logger = logging.getLogger()
#
fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s') # 格式
# 人 —— 练会了吸星大法
fh = logging.FileHandler('log',encoding='utf-8')  # 创建了一个文件操作符
fh.setFormatter(fmt)         #给文件操作符设置一个格式
logger.addHandler(fh)  # 给logger对象添加fh武功
#
# # 在屏幕上输入
sh = logging.StreamHandler()
sh.setFormatter(fmt)
sh.setLevel(logging.WARNING)
logger.addHandler(sh)

# logging.StreamHandler()  # 创建了一个屏幕操作符
logger.setLevel(logging.DEBUG)

logger.debug('debug message')  # 调试的时候
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')  # 批判的
例题展示
2018-05-29 16:15:19,260 -4.logging模块.py- root - WARNING - warning message
2018-05-29 16:15:19,260 -4.logging模块.py- root - ERROR - error message
2018-05-29 16:15:19,260 -4.logging模块.py- root - CRITICAL - critical message
结果展示

猜你喜欢

转载自www.cnblogs.com/juxiansheng/p/9105670.html