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下的XSLT API进行web开发的简单教程
Apr 15 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
Python中的浮点数原理与运算分析
Oct 12 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python中的闭包函数
Feb 09 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
python实现一个简单的ping工具方法
Jan 31 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
Python3接口性能测试实例代码
Jun 20 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
自动跳转中英文页面
2006/10/09 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
js实现数字滚动特效
2019/12/16 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
Python读写unicode文件的方法
2015/07/10 Python
python实现决策树分类算法
2017/12/21 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
python科学计算之narray对象用法
2019/11/25 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
军训生自我鉴定范文
2013/12/27 职场文书
财产保全担保书范文
2014/04/01 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android