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 ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 Python
用Python编写web API的教程
Apr 30 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python 使用值来排序一个字典的方法
Nov 16 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
Python配置虚拟环境图文步骤
May 20 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python垃圾回收机制原理分析
Apr 13 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和javascript常用正则表达式及用法实例
2014/07/01 PHP
php头像上传预览实例代码
2017/05/02 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
js中的屏蔽的使用示例
2013/07/30 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Python实现简单的代理服务器
2015/07/25 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
c++工程师面试问题
2013/08/04 面试题
授权委托书公证
2014/09/14 职场文书
庆六一宣传标语
2014/10/08 职场文书
元宵节寄语大全
2015/02/27 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
《雷雨》教学反思
2016/02/20 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android