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 相关文章推荐
SVM基本概念及Python实现代码
Dec 27 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
python else语句在循环中的运用详解
Jul 06 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
python cookie反爬处理的实现
Nov 01 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 Python
python 实现IP子网计算
Feb 18 Python
详解python字符串驻留技术
May 21 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
Email+URL的判断和自动转换函数
2006/10/09 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php while循环得到循环次数
2013/10/26 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
玩转方法:call和apply
2014/05/08 Javascript
javascript常见操作汇总
2014/09/03 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
新员工入职欢迎词
2015/01/23 职场文书
生日宴会祝酒词
2015/08/10 职场文书