haslib 模块

一、模块简介

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

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

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

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

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

1 import hashlib      #导入模块
2 
3 md5 = hashlib.md5()   #拿到一个操作句柄
4 md5.update(b'fuyong')  #获取一个二进制格式的字符串
5 ret = md5.hexdigest()  #对字符串进行摘要(加密)
6 print(ret)

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

1 import hashlib
2 
3 md5 = hashlib.md5()
4 md5.update(b'fu')
5 md5.update(b'yong')
6 ret = md5.hexdigest()
7 print(ret)

二、摘要算法应用

1、密码加密

 1 import hashlib
 2 
 3 #注册
 4 username = input('请输入您的账号:')
 5 password = input('请输入您的密码:')
 6 
 7 md5 = hashlib.md5()
 8 md5.update(bytes(password,encoding='utf-8'))
 9 password_md5 = md5.hexdigest()
10 with open('db.txt','w') as f:
11     f.write('%s|%s'%(username,password_md5))
12 
13 #登录
14 username = input('请输入您的账号:')
15 password = input('请输入您的密码:')
16 
17 with open('db.txt') as f2:
18     for line in f2:
19         usr,pwd = line.split('|')
20 
21         md5 = hashlib.md5()
22         md5.update(bytes(password,encoding='utf-8'))
23         pwd_md5 = md5.hexdigest()
24 
25         print(usr,pwd_md5)
26         print(username,pwd)
27         if username == usr and pwd == pwd_md5:
28             print('登录成功!')
29         else:print('用户名或密码错误')

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

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

加密后的内容如下:

 1 f05c56828c61a55d3ce059100068bdcd
 2 6506279244d90ceaac13994b41738f48
 3 3d16013fe5fbed42346f8a1396ba8ef5
 4 f65e3bedac580f0eb21d2776ae885ae1
 5 58cd22396ecc83d55df4d313bbdaebd1
 6 f90878ba0bf07fcf046988a3ea6d667f
 7 476b4eac07b8df2fbdc2dc6e1387dbe0
 8 98ec9f2372a46568ff05cd047427464e
 9 f77354fdc488fa4427483e8e5471cd85
10 00ba3a0214dd8bac6243ddec255891e6
11 273b3a655dfda415274c15af97a52104
12 76c96bb387c935653db74a8baa9c026f
13 ffcb2285ca60541fc15c273c16b5c950
14 197f58e84a263ef3fd8014d341d8466b
15 f4c5ed380f22f04c97c213a548834f2a
16 d5eda207414962fb145755013afb3fd7
17 42a5f3f06ec5bb6c4ac2ade6feb86678
18 f3d76adaf44ca76bedf81d35bef125e1
19 2ccc0e09998097e85dc3c3902a250ca5
20 3817e29c0f30ea2ce5f4d09f4fcf506a
21 407cd1de9b1268a4014533e6d7015cdf
22 525a1958213f4310e05ff5575998115b
23 5594b47dfe7cbf2e85e92c3350766452
24 2a34a7c32b5f6283be9e8ac14fd5cd8f
25 c6650f96e2f4e394bb2b17c0cace345a
26 13584507580d2a87006add71d3262a9a
27 f1c8ae56fe29d43a50fee8042ba64ccb
28 b3ee322519c84966bb3306e7eb5355ce
29 88d302edb98a9d1c3446bc29a5d5d4d8
30 b4033caf45c4fabe234505682f65b414
31 2cf5be2bedebd63fa2334e7bae1b5b3b
32 668585f2f51bbf1f8335b471acfad755
33 f60aa0aa64349145b174074c4afa8a72
34 c2c5ebfc8b9a6b3ee799b9f57ff35a88
35 1b7bd28b5bbdc4f3f96497f24917115a
36 c76d8d057aac29cf87a8e96de45ad675
37 49eca1f81415dddc026700a2af3b7bdc
38 2f5e1e118990bb9f5c2dc3f43d5292cf
39 d8e4d5d5be3a75dda8be3e8b2ccd575e
40 4681543960bb92d81543968dd94b187b
41 67587d0f6790287e6c21c2a06a26c811
42 904260c971ea57965d29476722f15c02
43 630df1ade921f0758ce20298a51515e0
44 5b24031481a2219f9ed5a01573661d8e
45 0e7397894f8e2ad42956da85da59cc86
46 f4031b5997df1ffa71c422b2548814d6
47 75dc942b80943694bbe8483df713a791
48 cc0d39c7910105382cfb5e4e44467d8c
49 3f10ecd1f7ba074352be9676be9f9c5c
50 84d82975fd42d031d0382110728cc618
51 016c89898810b369bb1bd155489098ae
52 cc8a8979651f0f40470f230367ecd06c
53 bd908cbfae898934d572f7c54f8e06f3
54 109f6e88a04dedd91ba6f1d72cd3a58b
55 904d9d06826e2142eb2305a28f31bcd7
56 cac2dc1992c5d36c4bd81518dd55f394
57 3232ea30e0a71e5f5c3e83676f64c9eb

三、为算法加盐

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

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

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

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Brian

Install Python3.6.x on CentOS7

---- 概述 在之前的文章中,我已经介绍了在CentOS6中安装Python2.7.x和Python3.4.x。请参考源码编译安装或者升级Python在Cen...

1.2K60
来自专栏灯塔大数据

塔秘 | 极简Python带你探索分类与回归的奥秘

前言 本文从分类和回归两个方面介绍了基本的监督学习方法,并用Scikit-Learn做了实例演示。 ? 为何使用人工智能和机器学习? 地球的未来在于人工智能和机...

446120
来自专栏灯塔大数据

技术 | Python从零开始系列连载(六)

导读 为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载 上一期学习了Python程序的基本控制流程,相信大家...

34970
来自专栏Brian

Python进阶教程(三)

Python 进阶 我们在Python进阶教程(二),介绍了一些Python进阶用法。今天给大家介绍的是和c/c++混合编程的用法。我们都知道特别是Python...

40340
来自专栏灯塔大数据

推荐 | 6 款 Python 特殊文本格式处理库

前言 以下是一些 Python 编写的用来解析和操作特殊文本格式的库,希望对大家有所帮助。 1 Tablib https://www.oschina.net/p...

40460
来自专栏灯塔大数据

技术 | Python从零开始系列连载(七)

导读 上一期学习了Python程序的基本控制流程,相信大家都已经熟悉啦,我们这一期就来学习Python特色数据类型(列表)吧! Python特色数据类型(列表)...

359100
来自专栏灯塔大数据

技术 | Python从零开始系列连载(八)

导读 上一期学习了Python特色数据类型(列表)上半节,相信大家都已经熟悉啦,我们这一期就来学习Python特色数据类型(列表)下半节吧! 列表切片 列表切片...

38160
来自专栏柠檬先生

Python 基础 类的继承

如果寂静定义了Person类,需要定义新的Student 和Teacher 类时     可以直接从Person 中继承     class Person(Ob...

37360
来自专栏灯塔大数据

手把手 | 教你用Python创建微信聊天机器人

前言 最近研究微信 API,发现个非常好用的 python 库:wxpy。wxpy 基于 itchat,使用了 Web 微信的通讯协议,实现了微信登录、收发消息...

83460
来自专栏Brian

Python Data Model

概述 最近在看《Fluent Python》一书,书中解释了Python很多重要的设计理念和实践,下面是我在看此书的读书笔记。Python的设计思想主要体现在它...

40260

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励