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中使用sort()方法进行排序的简单教程
May 21 Python
深入理解python中的atexit模块
Mar 07 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
opencv python 2D直方图的示例代码
Jul 20 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python socket模块方法实现详解
Nov 05 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python如何读取、写入JSON数据
Jul 28 Python
python判断元素是否存在的实例方法
Sep 24 Python
深度学习详解之初试机器学习
Apr 14 Python
Pandas自定义选项option设置
Jul 25 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
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php封装的smarty类完整实例
2016/10/19 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
js跳转页面方法总结
2014/01/29 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
Python 数据结构之旋转链表
2017/02/25 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
化学相关工作求职信
2013/10/02 职场文书
党员领导干部承诺书
2014/05/28 职场文书
民事纠纷协议书
2016/03/23 职场文书