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同时向控制台和文件输出日志logging的方法
May 26 Python
python 类详解及简单实例
Mar 24 Python
python3爬取数据至mysql的方法
Jun 26 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
520使用Python实现“我爱你”表白
May 20 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
Python答题卡识别并给出分数的实现代码
Jun 22 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输出数组中重名的元素的几种处理方法
2012/09/05 PHP
php单例模式实现方法分析
2015/03/14 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
利用python实现汉诺塔游戏
2021/03/01 Python
自考自我鉴定范文
2013/10/30 职场文书
销售主管的自我评价分享
2014/01/03 职场文书
出生公证委托书
2014/04/03 职场文书
数据保密承诺书
2014/06/03 职场文书
信息合作协议书
2014/10/09 职场文书
房屋所有权证明
2015/06/19 职场文书
遗失证明范文
2015/06/19 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
Feign调用传输文件异常的解决
2021/06/24 Java/Android