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实现简单的可逆加密程序实例
Mar 05 Python
python3序列化与反序列化用法实例
May 26 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
Python下Fabric的简单部署方法
Jul 14 Python
20个常用Python运维库和模块
Feb 12 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
对python中Json与object转化的方法详解
Dec 31 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 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 图像函数大举例(非原创)
2009/06/20 PHP
php 多个submit提交表单 处理方法
2009/07/07 PHP
PHP中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
Pytorch之contiguous的用法
2019/12/31 Python
Python类继承和多态原理解析
2020/02/05 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
优秀毕业生自荐信范文
2014/01/01 职场文书
超市总经理岗位职责
2014/02/02 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
优秀大学生申请书
2019/06/24 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
vue判断按钮是否可以点击
2022/04/09 Vue.js
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL