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
python字典的常用操作方法小结
May 16 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
详解Python中的动态属性和特性
Apr 07 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
详解Python3 pickle模块用法
Sep 16 Python
python中shell执行知识点
May 06 Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
python实现网络五子棋
Apr 11 Python
Python基础之tkinter图形化界面学习
Apr 29 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日历类分享
2014/11/18 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
python针对excel的操作技巧
2018/03/13 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
五四演讲稿范文
2014/09/03 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
利用Apache Common将java对象池化的问题
2022/06/16 Servers