一 hashlib加密
1 什么是hash
Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2 MD5
MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。
MD5的功能:
- 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
- 不同的输入得到的不同的结果(唯一性)
MD5特点:
- 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
- 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
3 SHA-1
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
MD5与SHA-1的比较:
由于MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有很多相似之处,SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。产生具有相同摘要的两个报文的难度:MD5是264是数量级的操作,SHA-1 是280数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。
4 Python提供的相关模块
用于加密相关的操作,3.x里用hashlib代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib # md5 m = hashlib.md5() m.update(b"Hello") m.update(b"It's me") print(m.digest()) # 返回2进制格式的hash值 m.update(b"It's been a long time since last time we ...") print(m.hexdigest()) # 返回16进制格式的hash值 # sha1 s1 = hashlib.sha1() s1.update("小猿圈".encode("utf-8")) s1.hexdigest() # sha256 s256 = hashlib.sha256() s256.update("小猿圈".encode("utf-8")) s256.hexdigest() # sha512 s512 = hashlib.sha256() s512.update("小猿圈".encode("utf-8")) s512.hexdigest()
二 logging模块
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
- 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息
- print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出
''' 将log 输出至文件 logging.basicConfig(filename='testlog', level=logging.INFO) logging.debug('This message should go to the log file') logging.info('So should this') ''' ''' 自定义日志格式 logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %I:%M:%S', filename='testlog', level=logging.DEBUG) logging.debug('test the time') ''' ''' 每个组件的主要功能 logger 每个程序在输出信息之前都要获取一个logger, logger通常对应了程序的模块名,比如mysql LOG = logging.getLogger("mysql") 而核心模块可以这样 LOG = logging.getLogger("chat.kernel") 还可以绑定handler和filters Logger.setLevel(lel): 指定最低的日志级别,低于lel的级别被忽略,debub是内置最低级别 Logger.addFilter(filt):添加指定的filter Logger.removeFilter(filt): 删除指定filter Logger.addHandler(hdlr):添加指定的handler handler handler对象负责发送相关的信息到指定目的地,Python的日志系统有多种handler可以使用,有些handler 可以把相关信息输出到控制台,有些handler可以把信息输出到文件,还有戏可以发送到网络上 Handler.setLevel(lel): 指定处理的信息级别,低于lel级别的信息被忽略 Handler.setFormatter(): 给handler设定一个格式 ''' ''' fmt中允许使用的变量可以参考下表。 %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名| %(funcName)s 调用日志输出函数的函数名| %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示| %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数| %(asctime)s 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s 用户输出的消息 ''' class IgnoreBackupLogFilter(logging.Filter): '''忽略带db backup的日志''' def filter(self, record): return 'db backup' not in record.getMessage() from logging import handlers # 生成log对象并设定全局log级别 logger = logging.getLogger('mysql') logger.setLevel(logging.DEBUG) # 把filter对象添加到logger中 logger.addFilter(IgnoreBackupLogFilter()) # 生成屏幕handler对象和文件handler对象 ch = logging.StreamHandler() # fh = logging.FileHandler('mysql') # 设置日志文件的滚动 fh = handlers.RotatingFileHandler('mysql', maxBytes=10, backupCount=3) # 设定handler日志级别 ch.setLevel(logging.DEBUG) fh.setLevel(logging.INFO) # 把handler对象绑定到logger logger.addHandler(ch) logger.addHandler(fh) # 生成formatter对象 file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %I:%M:%S') console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %I:%M:%S') # 把formatter对象绑定handler对象 ch.setFormatter(console_formatter) fh.setFormatter(file_formatter) logger.debug('db backup') logger.debug('tete') logger.debug('db backup sdf') logger.warning('sdfdsf')