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实现ipsec开权限实例
Nov 11 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
python破解zip加密文件的方法
May 31 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
python如何生成各种随机分布图
Aug 27 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
opencv调整图像亮度对比度的示例代码
Sep 27 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
详解Python牛顿插值法
May 11 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 删除cookie和浏览器重定向
2009/03/16 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
设定php简写功能的方法
2019/11/28 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python传递参数方式小结
2015/04/17 Python
Python socket实现简单聊天室
2018/04/01 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
财务会计专业毕业生自荐信
2013/10/19 职场文书
初中音乐教学反思
2014/01/12 职场文书
学校清明节活动总结
2014/07/04 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
个人年终总结开头
2015/03/06 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript