模块hashlib和logging
Python的hashlib提供了常见的摘要算法MD5。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib md5=hashlib.md5() md5.update('how to use md5 in python'.encode('utf-8')) print(md5.hexdigest())
如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
import hashlib md5=hashlib.md5() md5.update('how to use md5'.encode('utf-8')) md5.update(' in python'.encode('utf-8')) print(md5.hexdigest()) >>> cdbbdefc48242586611e311f84e921b0
考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:
'e10adc3949ba59abbe56e057f20f883e': '123456' '21218cca77804d2ba1922c33e0151105': '888888' '5f4dcc3b5aa765d61d8327deb882cf99': 'password'
这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号.
由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
例如一个简单的用户登录实例:
import hashlib SALT = b'2erer3asdfwerxdf34sdfsdfs90' def md5(pwd): # 实例化对象 obj = hashlib.md5(SALT) # 写入要加密的字节 obj.update(pwd.encode('utf-8')) # 获取密文 return obj.hexdigest() # c5395258d82599e5f1bec3be1e4dea4a user = input("请输入用户名:") pwd = input("请输入密码:") if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a': print('登录成功') else: print('登录失败')
logging模块
import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/tmp/test.log', filemode='w') logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')