python 学习_day28_常用模块补充

一、摘要算法——hashlib模块

1、算法介绍

  Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

  什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

2、MD5算法

  MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似,对于相同数据分块进行update(),hexdigest()得出的结果是一样的:

import hashlib
md5_obj = hashlib.md5()
md5_obj.update(bytes(‘李李‘,encoding=‘utf-8‘))           #update方法接收字节数据类型
md5_obj.update(bytes(‘李李李‘,encoding=‘utf-8‘))
md5_obj.update(bytes(‘杰杰杰杰杰‘,encoding=‘utf-8‘))
print(md5_obj.hexdigest())                              #输出结果:2dc701a9f49031673c8f7f9622b7000f

import hashlib
md5_obj = hashlib.md5()
md5_obj.update(bytes(‘李李李李李杰杰杰杰杰‘,encoding=‘utf-8‘))
print(md5_obj.hexdigest())                              #输出结果;2dc701a9f49031673c8f7f9622b7000f

3、MD5算法的应用

(1)检查文件的一致性:文字文件:逐行读取,视频文件:按字节读

#检查文字文件
import hashlib
md5_obj = hashlib.md5()
f = open(‘filename‘,‘rb‘)
for line in f:
    md5_obj.update(line)
print(md5_obj.hexdigest())
#检查视频文件
import hashlib
import os
filesize = os.path.getsize(‘filename‘)
f = open(‘filename‘,‘rb‘)
md5_obj = hashlib.md5()
while filesize > 0 :
    readsize = 10 if filesize>10 else filesize            #每次读取量根据文件大小自己决定
    content = f.read(readsize)
    md5_obj.update(content)
    filesize -= readsize
print(md5_obj.hexdigest())

(2)储存密文密码

  如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153
alice    | 99b1c2188db85afee403b1536010c2c9

  考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

‘e10adc3949ba59abbe56e057f20f883e‘: ‘123456‘
‘21218cca77804d2ba1922c33e0151105‘: ‘888888‘
‘5f4dcc3b5aa765d61d8327deb882cf99‘: ‘password‘

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

hashlib.md5("salt".encode("utf8"))

  经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

import hashlib
#存储密文密码
f = open(‘userinfo‘,‘w‘)
md5 = hashlib.md5(b‘salt‘)  #加盐处理
md5.update(b‘3714‘)
md5_value = md5.hexdigest()
f.write(‘alex|%s\n‘%md5_value)
f.close()
#登录读取验证
pwd = input(‘pwd : ‘)
f = open(‘userinfo‘)
alex_info = f.readline().strip()
user,passwd = alex_info.split(‘|‘)
md5 = hashlib.md5(b‘salt‘)  #加盐处理
md5.update(bytes(pwd,encoding=‘utf-8‘))
if passwd == md5.hexdigest():
    print(‘登录成功‘)

  摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

时间: 2024-10-09 13:44:42

python 学习_day28_常用模块补充的相关文章

Python学习 :常用模块(二)

常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir() # 返回当前目录('.') os.pardir() # 获取当前目录的父目录字符串名('..') os.makedirs() # 生成多层递归目录('April\\Week1\\Day3') os.removedirs() # 从最里层往外删除空的文件夹,若文件夹为空,将会删除:若文件夹不为空,

Python学习笔记-常用模块

1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作为输入执行.这就是传说中的 脚本.随着你的程序变得越来越长,你可能想要将它分割成几个更易于维护的文件.你也可能想在不同的程序中使用顺手的函数,而不是把代码在它们之间中拷来拷去. 为了满足这些需要,Python 提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用.这样的文件被称

Python学习 :常用模块(三)

常用模块(三) 七.logging模块 日志中包含的信息应有正常的程序访问日志,还可能有错误.警告等信息输出 python的 logging 模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging 的日志可以分为 debug() , info() , warning() , error() , critical() 5个级别 Eg.简单的日志记录 import logging logging.debug('debug message') logging.info('info m

Python学习 :常用模块(一)

常用模块(一) 一.时间(time)模块 时间戳 (Timestamp):时间戳表示的是从1970年1月1日00:00:00为计时起点,到当前的时间长度 import time print(help(time)) 查看time模块的官方说明 time.time() # 返回当前时间的时间戳 print(time.time()) >>> 1540191340.5649574 time.clock() # 计算CPU执行的时间 print(time.clock()) >>>

python学习之-常用模块

json 和pickle 模块 json和pickle模块下都有4个功能 dumps  <---> loads  (序列化 <--->反序列化) dump <---> load (简单写法序列化<---> 简单写法反序列化) 用途:序列化模块 什么是序列化 序列化就是把内存中数据类型转换成一种可以存储到硬盘/基于网络传输的中间格式 反序列化就是将中间格式转成相对应的数据类型 PS:不同平台的数据类型是无法识别的,如果数据要夸平台交互,被其他平台识别,那就要把

Python学习day20 常用模块部分

模块:pip install 模块名称安装模块导入模块  from collections import namedtuplecollections模块:提供了几个额外的数据类型: Counter.deque.defaultdict.namedtuple\OrderedDict1.namedtuple:生成可以使用名字来访问元素内容的tuple2.deque:双端队列,可以快速的从另外一侧追加和推出对象3.Counter:计数器4.OrderedDict字典有序化5,defaultdict字典解

Python 学习5 常用模块

可以参考这个博客的地址http://www.cnblogs.com/alex3714/articles/5161349.html 本文为转载 地址http://www.cnblogs.com/alex3714/articles/5161349.html 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess loggin

python学习:常用模块

原文地址:https://www.cnblogs.com/blitz2000/p/9465448.html

文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象

本篇内容: 常用模块的补充 python面相对象 一.常用模块补充 1.configparser模块 configparser 用于处理特定格式的文件,起内部是调用open()来实现的,他的使用场景是操作特定格式的文件. 特定的格式如下: # [section1] #节点名称 k1 = v1 #值1 k2 = v2 #值2 [section2] #节点名称 k1 = v1 #值 获取文件中的所有节点 ##configparser 模块使用 #1.获取所有的节点 import configpars