Python hashlib模块用法实例分析


Posted in Python onJune 12, 2018

本文实例讲述了Python hashlib模块用法。分享给大家供大家参考,具体如下:

一、hashlib基本使用

python中的hashlib模块用来进行hash或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法。其支持Openssl库提供的所有算法,包括md5、sha1、sha224、sha256、sha512等。

常用的属性和方法:

algorithms:列出所有加密算法('md5','sha1','sha224','sha256','sha384','sha512')
digesti_size:产生的散列的字节大小
md5()/sha1():创建一个md5或者sha1加密模式的hash对象
update(arg):用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b)
digest():返回摘要,作为二进制数据字符串值
hexdigest():返回摘要,作为十六进制数据字符串值
copy():复制

下面是一个简单的加密示例:

import hashlib
m = hashlib.md5()
m.update('how to use md5'.encode('utf-8'))
m.update('in python hashlib'.encode('utf-8'))
print m.hexdigest()

返回值如下:

9f97604918a2e86bfcc4aea5c35a4c8b

下面一个示例用于计算文件md5值:

#!/usr/bin/env python
#coding: utf-8
import hashlib
import sys
def main():
  if len(sys.argv) != 2:
    sys.exit('Usage: %s file' % sys.argv[0])
  filename = sys.argv[1]
  m = hashlib.md5()
  with open(filename, 'rb') as fp:
    while True:
      blk = fp.read(4096) # 每次读取4kb
      if not blk: break
      m.update(blk)
  print m.hexdigest(), filename
if __name__ == '__main__':
  main()

二、hashlib的应用场景

摘要算法通常应用于网站存储用户的帐号密码相关信息。默认情况下,我们插入到数据库的帐号密码都是以明文保存。这样的话,一旦数据库泄露,所有用户的口令都会直接泄露,而且明文保存,网站管理员也可以直接查看到用户口令,这样及不安全。所以我们可以在获取到用户输入的密码以后,直接对其进行加密处理。然后将加密的字符串存入数据库。这样当下次用户登录时,再对用户输入的密码进行加密处理,然后与数据库中存储的加密字串进行比对,如果匹配,则说明密码正确。

当然上述方法比明文存储密码确实要安全不少。但在有些场景中,用户通常会将密码设置的尤为简单。这样如果数据库泄露,黑客可以通过简单的密码尝试来完成对加密字串的匹配。为了解决这种方法,我们通常需要对密码做“加盐”处理。如下:

def get_md5(password):
  m = hashlib.md5()
  m.update(password)
  return m.hexdigest()
def calc_md5(password):
  return get_md5(password + 'the-Salt')
db = {}
def register(username,password):
  db[username] = username
  db[password] = calc_md5(password)

这样,只要'the-Salt'部分不被泄露,就没办法反推用户的简单密码。

但是这样仍然有个问题,那就是多个用户的密码可能重复,这样,在数据库里就会出现相同的加密字串。我们知道通常而言,用户的用户名肯定不会相同。我们再假设用户的用户名不会改变。我们可以使用用户的用户名来做加盐处理,如下:

def clc_md5(username,password):
  return get_md5(passwd + username + 'the-Salt')
Python 相关文章推荐
Python ZipFile模块详解
Nov 01 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python3处理HTTP请求的实例
May 10 Python
Python基于dom操作xml数据的方法示例
May 12 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
python获取服务器响应cookie的实例
Dec 28 Python
python实现基于朴素贝叶斯的垃圾分类算法
Jul 09 Python
Python中__repr__和__str__区别详解
Nov 07 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
Django模型验证器介绍与源码分析
Sep 08 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
python中itertools模块zip_longest函数详解
Jun 12 #Python
Python subprocess模块常见用法分析
Jun 12 #Python
python 基本数据类型占用内存空间大小的实例
Jun 12 #Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 #Python
使用Python进行QQ批量登录的实例代码
Jun 11 #Python
python中使用psutil查看内存占用的情况
Jun 11 #Python
Python运维之获取系统CPU信息的实现方法
Jun 11 #Python
You might like
关于php循环跳出的问题
2013/07/01 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
网络技术支持面试题
2013/04/22 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
药店促销活动策划方案
2014/08/24 职场文书
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers