PYTHON开发包(一)hashlib(哈希)logging(日志模块)

哈希算法的特点

1、输入敏感

2、不可逆

3、计算极快且长度固定

哈希算法的用途

1、密码加密

        由于哈希算法不能逆运算的特点,在传播途中被截获后泄密的危险变小(但不是没有),哈希运算的特点决定了只能以加密对应加密的方法来传播密码,只要知道哈希值以及使用的算法版本,在拥有足够的算力下可以通过将数字通过相应版本运算来推测哈希值的方法来破解密码。

        #  8位纯数字密码仅有10^{8}即1亿种组合

        #  i5四核电脑,每秒可以计算200亿次

        #  网络上有密码库可供借鉴

2、文件完整性校验

        在下载官网一般有官网通过计算获得的哈希值,在下载完成后可以通过计算哈希值的方法校验文件是否完整或者被篡改。

哈希算法的用法

1、哈希运算

import hashlib 
#引用哈希算法相应的包

h1=haslib.md5()
#选择相应的哈希算法版本为md5,并将其返回给h1(返回值是一个算法)。即h1现在是哈希运算输入真正的位置。
h1.update('abc'.encode('utf-8'))
h1.update('123'.encode('utf-8'))
#由于哈希运算的输入值必须为二进制数据,通过“.encode('utf-8')”将前面的字符串等转化为二进制。
#可以多次输入数据进行哈希运算,输出值位多次输入值的穿行连接后的运算结果。
print(h1.hexdigest())
#进行哈希运算并输出

2、文件完整性校验

#小型文件校验

import hashlib
path = '文件绝对地址'

with open(path,'rb')as f:
#以rb格式读取path的文件
   m1 = haslib.md5(f.reed())

print(m1.hexdigest())

        小型文件对于内存的压力比较小,可以采用本方法校验,当文件非常大时会导致内存压力过大,此时可以采用分段且截取少量字节的方法来运算验证。

#大型文件校验

import hashlib
import os
path = '文件绝对地址'

print(os.path.getsize(path))
#获取并输出文件大小
m = hashliab.md5

with open(path,'rb')as f:
    f.seek(0,2)
    #将指针移动到文件的最后一格,第一个数值是移动个数,第二个数据是位置
    size = f.tell()
    #读取文件指针的位置
    print(size)
#获取并输出文件大小的另一种方法
    
    one——tenth = size//10
    #size对10整除
    for i in range(10):
        f.seek(i*one-tenth,0)
        #移动指针到十分之一乘以次数的位置
        res = f.read(100)
        #读取100位数据存入res
        m.update(res)
        #将res中的值录入m
print(m.hesdigest())

tips:密码加盐(在进行哈希运算的时候可以采用切片插入特殊数据的方式加大密码的安全性)

 logging的用途

        logging是打印程序日志的一款包,在程序非常大时通过·print打印程序的成本和效率不高,且无法对日志进行详细处理。我们可以用logging中的方法打印并处理不同级别的日志输出。

 logging的用法

#全局输出调用

import logging
#引入logging包

logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='logtxt',
filemode='w') 
#默认条件下本函数只打印在warning等级以上的程序输出,我们可以通过basicConfig方法调节输出等级。需要注意的是.basicConfig方法必须放在输出方法之前。还可以通过format设置输出格式,filename和filemode设置文件的打开方法和文件名。

logging.debug("debug msg")
#debug级别是最详细的日志级别,用于记录详细的调试信息。
logging.info("info msg")
#info级别表示程序中有一个状态发生了改变,无需担心,请继续完成手头的任务。
logging.warning("warning msg")
#warning级别表示错误可能已经发生,不会影响程序运行,仅标记问题发生位置,不处理可能影响程序效率。
logging.error("error msg")
#error级别表示错误已经发生,但不会影响其他方法的运行,需要解决但问题可能来自外部。
logging.critical("critical msg")
#critical级别表示最高级别的日志,用于表示严重错误,可能导致程序无法继续运行。

#logger自定义日志输出

import logging

logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='logtxt',
filemode='w')

test_logger = logging.getLogger('test_logger')
#logging.getLogger(__name__)#直接通过__name__命名如果用python运行时值为“__main__”如果在文件中运行则为文件名
#新定义的logger会继承.basicCongfig定义的内容

test_logger.error("error from test_logger")
#直接输出的error会储存在logtxt中,输出名为text_logger

file_handler = logging.FileHandler('test_logger.txt',mode='w')
#可以使用filehandler对新添加logger进行规则编译
file_handler.setFormatter(logging.Formatter('%(levelnames)s - %(message)s'))、
#在file_handler中可以使用setFormatter和setFilename等修改规则
test_logger.addHandler(file_handler)

#在函数中常用方式

try:
    1/0
except:
    test_logger.exception("Get exception")

tips:

Logging format: https://docs.python.org/3/library/logging.html#logrecord-attributes

Logging handler: https://docs.python.org/3/howto/logging.html#useful-handlers

你可能感兴趣的:(哈希算法,算法)