一、模块简介

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

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

 import hashlib      #导入模块

 md5 = hashlib.md5()   #拿到一个操作句柄
md5.update(b'fuyong')  #获取一个二进制格式的字符串
ret = md5.hexdigest()  #对字符串进行摘要(加密)
print(ret)

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

 import hashlib

 md5 = hashlib.md5()
md5.update(b'fu')
md5.update(b'yong')
ret = md5.hexdigest()
print(ret)

二、摘要算法应用

1、密码加密

 import hashlib

 #注册
username = input('请输入您的账号:')
password = input('请输入您的密码:') md5 = hashlib.md5()
md5.update(bytes(password,encoding='utf-8'))
password_md5 = md5.hexdigest()
with open('db.txt','w') as f:
f.write('%s|%s'%(username,password_md5)) #登录
username = input('请输入您的账号:')
password = input('请输入您的密码:') with open('db.txt') as f2:
for line in f2:
usr,pwd = line.split('|') md5 = hashlib.md5()
md5.update(bytes(password,encoding='utf-8'))
pwd_md5 = md5.hexdigest() print(usr,pwd_md5)
print(username,pwd)
if username == usr and pwd == pwd_md5:
print('登录成功!')
else:print('用户名或密码错误')

2、读取一个文件内容,并且摘要

周杰伦等你下课歌词
等你下课(with 杨瑞代) - 周杰伦
词:周杰伦
曲:周杰伦
Jay:你住的 巷子里
我租了一间公寓
为了想与你不期而遇
高中三年 我为什么
为什么不好好读书
没考上跟你一样的大学
我找了份工作
离你宿舍很近
当我开始学会做蛋饼
才发现你 不吃早餐
喔 你又擦肩而过
你耳机听什么
能不能告诉我
合:躺在你学校的操场看星空
教室里的灯还亮着你没走
记得 我写给你的情书
都什么年代了
到现在我还在写着
总有一天总有一年会发现
有人默默的陪在你的身边
也许 我不该在你的世界
当你收到情书
也代表我已经走远
Gary:学校旁 的广场
我在这等钟声响
等你下课一起走好吗
Jay:弹着琴 唱你爱的歌
暗恋一点都不痛苦
Gary:一点都不痛苦
Jay:痛苦的是你
合:根本没看我
Jay:我唱这么走心
Gary:这么走心
Jay:却走不进你心里
Gary:进你心里
Jay:在人来人往
合:找寻着你 守护着你
不求结局
合:喔
Gary:你又擦肩
合:而过
Jay:我唱告白气球
终于你回了头
合:躺在你学校的操场看星空
教室里的灯还亮着你没走
记得 我写给你的情书
都什么年代了
到现在我还在写着
总有一天总有一年会发现
有人默默的陪在你的身边
也许 我不该在你的世界
当你收到情书
也代表我已经走远

db文件内容

加密后的内容如下:

 f05c56828c61a55d3ce059100068bdcd
6506279244d90ceaac13994b41738f48
3d16013fe5fbed42346f8a1396ba8ef5
f65e3bedac580f0eb21d2776ae885ae1
58cd22396ecc83d55df4d313bbdaebd1
f90878ba0bf07fcf046988a3ea6d667f
476b4eac07b8df2fbdc2dc6e1387dbe0
98ec9f2372a46568ff05cd047427464e
f77354fdc488fa4427483e8e5471cd85
00ba3a0214dd8bac6243ddec255891e6
273b3a655dfda415274c15af97a52104
76c96bb387c935653db74a8baa9c026f
ffcb2285ca60541fc15c273c16b5c950
197f58e84a263ef3fd8014d341d8466b
f4c5ed380f22f04c97c213a548834f2a
d5eda207414962fb145755013afb3fd7
42a5f3f06ec5bb6c4ac2ade6feb86678
f3d76adaf44ca76bedf81d35bef125e1
2ccc0e09998097e85dc3c3902a250ca5
3817e29c0f30ea2ce5f4d09f4fcf506a
407cd1de9b1268a4014533e6d7015cdf
525a1958213f4310e05ff5575998115b
5594b47dfe7cbf2e85e92c3350766452
2a34a7c32b5f6283be9e8ac14fd5cd8f
c6650f96e2f4e394bb2b17c0cace345a
13584507580d2a87006add71d3262a9a
f1c8ae56fe29d43a50fee8042ba64ccb
b3ee322519c84966bb3306e7eb5355ce
88d302edb98a9d1c3446bc29a5d5d4d8
b4033caf45c4fabe234505682f65b414
2cf5be2bedebd63fa2334e7bae1b5b3b
668585f2f51bbf1f8335b471acfad755
f60aa0aa64349145b174074c4afa8a72
c2c5ebfc8b9a6b3ee799b9f57ff35a88
1b7bd28b5bbdc4f3f96497f24917115a
c76d8d057aac29cf87a8e96de45ad675
49eca1f81415dddc026700a2af3b7bdc
2f5e1e118990bb9f5c2dc3f43d5292cf
d8e4d5d5be3a75dda8be3e8b2ccd575e
4681543960bb92d81543968dd94b187b
67587d0f6790287e6c21c2a06a26c811
904260c971ea57965d29476722f15c02
630df1ade921f0758ce20298a51515e0
5b24031481a2219f9ed5a01573661d8e
0e7397894f8e2ad42956da85da59cc86
f4031b5997df1ffa71c422b2548814d6
75dc942b80943694bbe8483df713a791
cc0d39c7910105382cfb5e4e44467d8c
3f10ecd1f7ba074352be9676be9f9c5c
84d82975fd42d031d0382110728cc618
016c89898810b369bb1bd155489098ae
cc8a8979651f0f40470f230367ecd06c
bd908cbfae898934d572f7c54f8e06f3
109f6e88a04dedd91ba6f1d72cd3a58b
904d9d06826e2142eb2305a28f31bcd7
cac2dc1992c5d36c4bd81518dd55f394
3232ea30e0a71e5f5c3e83676f64c9eb

摘要后的文件

三、为算法加盐

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

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

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

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

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

 import hashlib

 md5 = hashlib.md5('加盐的字符串写在这里,要进行编码'.encode('utf-8'))
md5.update(b'fuyong'+bytes('可以在这里再次进行加密,加的字不一样,结果就不一样',encoding='utf-8'))
ret = md5.hexdigest()
print(ret)

haslib 模块的更多相关文章

  1. 我的Python升级打怪之路【五】:Python模块

    模块,是一些代码实现了某个功能的集合 模块的分类: 自定义模块 第三方模块 内置模块 导入模块 import module from module.xx.xx import xx from modul ...

  2. python包-logging-hashlib-openpyxl模块-深浅拷贝-04

    包 包: # 包是一系列模块文件的结合体,表现形式是文件夹,该文件夹内部通常会包含一个__init__.py文件,本质上还是一个模块 包呢,就是前两篇博客中提到的,模块的四种表现形式中的第三种 # 把 ...

  3. day17_7.19包与logging模块,深浅拷贝

    一.包 在模块的定义里,模块就是方法的集合,可以将一些常用的方法封装到一个py文件中,通过调用使用,而且,其中的表现形式也有以包的形式导入. 其实,包就是一系列模块的结合体,表示形式就是一个文件夹,在 ...

  4. Python知识总汇

    一.python基础 python基础 python编码问题 逻辑运算 二.python数据类型 二.python数据类型 三.IO(文件处理) 三.IO(文件处理) 四.函数 函数基础 名称空间与作 ...

  5. Python模块02/序列化/os模块/sys模块/haslib加密/collections

    Python模块02/序列化/os模块/sys模块/haslib加密/collections 内容大纲 1.序列化 2.os模块 3.sys模块 4.haslib加密 5.collections 1. ...

  6. 19 模块之shelve xml haslib configparser

    shelve 什么是shelve模块 也是一种序列化方式使用方法 1.opne 2.读写 3.close特点:使用方法比较简单 提供一个文件名字就可以开始读写 读写的方法和字典一致 你可以把它当成带有 ...

  7. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  8. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  9. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

随机推荐

  1. 724. Find Pivot Index

    Given an array of integers nums, write a method that returns the "pivot" index of this arr ...

  2. Sum of odd and even elements

    Given an integer N, you have to print the sum of odd numbers and even numbers form 1 to N Input:Firs ...

  3. w 命令详解

    作用: 用于显示已经登录系统的用户列表, 并显示用户正在执行的指令. 执行这个命令可得知目前登入系统的用户有哪些人, 以及他们正在执行的程序.  单独执行w 命令会显示所有的用户, 您也可指定用户名称 ...

  4. 如何写一个SSH项目(三)如何进行交互的

    下面以登录为例子,展示从前台到后端的一整套流程并进行分析. 首先介绍一下我的SSH的分层结构 action和service一起是业务逻辑层          action层调用service层 dao ...

  5. 适合小白/外行的git与github最基础最浅显教程

    首先声明,这是适合小白/外行/初学者/学生看的最基础最简单的git与github教程,已经能使用svn,git等工具的朋友请不要看这篇文章来浪费时间了. 想进一步学习git的,推荐去廖雪峰博客学习. ...

  6. .Net Core建站(3):搭建三层架构

    啊,终于到写三层架构的时候了,老实说,我都不知道自己这个算不算三层架构,姑且就当它是吧,具体属于哪一个体系,希望有大佬指点一下(^o^)/ 不晓得有人注意到没有,我写了三篇博客,然后就改了三次标题ヽ( ...

  7. SVG 入门——理解viewport,viewbox,preserveAspectRatio

    工欲善其事必先利其器,没有真正搞懂SVG里的viewport,viewbox, preserveAspectRatio这三个属性,就很容易遇到坑,最近写项目用到svg这三个属性被我一眼就略过 ,后来发 ...

  8. CSS Sprites使用

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...

  9. 中国孩子的micro:bit:TurnipBit自制小乐器教程实例

    孩子们是最贪玩的也是最聪明的,因此在过去的数年中,市面上出现了不少寓教于乐的理工科知识(STEM)学习新方法.如今这类产品中又有了一名新成员,TPYBoard重磅推出一款针对小白.中小学生的可编程计算 ...

  10. JavaWeb项目中获取对Oracle操作时抛出的异常错误码

    最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...