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 with statement 进行文件操作指南
Aug 22 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
python中nan与inf转为特定数字方法示例
May 11 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
Python如何计算语句执行时间
Nov 22 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
基于python实现把json数据转换成Excel表格
May 07 Python
Python面向对象实现方法总结
Aug 12 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
Python代码实现双链表
May 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
ecshop实现smtp发送邮件
2015/02/03 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
详解Bootstrap插件
2016/04/25 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
详细解读Python中的__init__()方法
2015/05/02 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
详解Python IO口多路复用
2020/06/17 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
创业计划书六个要素
2013/12/26 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
2014年招生工作总结
2014/11/26 职场文书
班级管理经验交流材料
2015/11/02 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android