Python3 加密(hashlib和hmac)模块的实现


Posted in Python onNovember 23, 2017

以下代码以Python3.6.1为例

  1. hashlib : 不可逆加密
  2. hmac : 不可逆键值对方式加密

hashlib模块简介:

hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)实现了一个公共的、通用的接口,也可以说是一个统一的入口。因为hashlib模块不仅仅是整合了md5和sha模块的功能,还提供了对更多中算法的函数实现,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512。

hashlib模块使用步骤:

1)获取一个哈希算法对应的哈希对象(比如名称为hash): 可以通过 hashlib.new(哈希算法名称, 初始出入信息)函数,来获取这个哈希对象,如hashlib.new('MD5', 'Hello'),hashlib.new('SHA1', 'Hello')等;也可以通过hashlib.哈希算法名称()来获取这个哈希对象,如hashlib.md5(), hashlib.sha1()等。

2)设置/追加输入信息: 调用已得到哈希对象的update(输入信息)方法可以设置或追加输入信息,多次调用该方法,等价于把每次传递的参数凭借后进行作为一个参数垫底给update()方法。也就是说,多次调用是累加,而不是覆盖。

3)获取输入信息对应的摘要: 调用已得到的哈希对象的digest()方法或hexdigest()方法即可得到传递给update()方法的字符串参数的摘要信息。digest()方法返回的摘要信息是一个二进制格式的字符串,其中可能包含非ASCII字符,包括NUL字节,该字符串长度可以通过哈希对象的digest_size属性获取;而hexdigest()方法返回的摘要信息是一个16进制格式的字符串,该字符串中只包含16进制的数字,且长度是digest()返回结果长度的2倍,这可用邮件的安全交互或其它非二进制的环境中。

#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/19'
# hash_demo.py Hash加密相关(安全哈希)
# 支持: MD5, SHA1 SHA224 SHA256 SHA384 SHA512


import hashlib


def hash_demo():
  m = hashlib.md5()
  m.update(b"hello")
  m.update(b"world!") # = hello + world!

  hash_hex = hashlib.sha3_512(b"luzhuo.me").hexdigest()

  print(m.digest_size)
  print(m.digest()) # 二进制hash
  print(m.hexdigest()) # 十六进制hash
  print(hash_hex)

  # 加盐加密
  hash_bytes = hashlib.pbkdf2_hmac('sha256', b'luzhuo.me', b'80', 100000)
  print(hash_bytes)

 

def hash_func():
  # hashlib.new(name[, data]) // 创建hashlib(非首选), name=算法名, data:数据
  hash = hashlib.new('ripemd160', b'luzhuo.me')

  # 常量
  dics = hashlib.algorithms_guaranteed # 所有平台支持的hash算法的名称
  dics = hashlib.algorithms_available # 在Python解析器中可用的hash算法的名称, 传递给new()时, 可识别

  # hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) // 加盐加密 hash_name:hash名称, password:数据, salt:盐, iterations:循环次数, dklen:密钥长度
  hash_bytes = hashlib.pbkdf2_hmac('sha256', b'luzhuo.me', b'80', 100000)

  # hash对象
  num = hash.digest_size # hash结果的大小
  num = hash.block_size # hash算法的内部块的大小
  strs = hash.name # hash名称, 可传给new()使用
  hash.update(b"data") # 字节缓冲区 hash.update(a) hash.update(b) == hash.update(a+b)
  hash_bytes = hash.digest() # 字节hash
  hash_str = hash.hexdigest() # 16进制字符串hash
  hash = hash.copy() # 拷贝hash对象副本

 

if __name__ == "__main__":
  hash_demo()

  # hash_func()

hashmac模块简介:

前面说过,HMAC算法也是一种一种单项加密算法,并且它是基于上面各种哈希算法/散列算法的,只是它可以在运算过程中使用一个密钥来增增强安全性。hmac模块实现了HAMC算法,提供了相应的函数和方法,且与hashlib提供的api基本一致。

hmac模块使用步骤:

hmac模块模块的使用步骤与hashlib模块的使用步骤基本一致,只是在第1步获取hmac对象时,只能使用hmac.new()函数,因为hmac模块没有提供与具体哈希算法对应的函数来获取hmac对象。

#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/19'
# hmac_demo.py HMAC算法
# 与hashlib不同之处在于多了key

import hmac


def hmac_demo():
  # 加密
  h = hmac.new(b"net")
  h.update(b"luzhuo.me")
  h_str = h.hexdigest()
  print(h_str)

  # 比较密码
  boolean = hmac.compare_digest(h_str, hmac.new(b"net", b"luzhuo.me").hexdigest())
  print(boolean)

 

def hmac_func():
  # 创建key和内容,再都进行加密
  # hmac.new(key, msg=None, digestmod=None) // 创建新的hmac对象, key:键, msg:update(msg), digestmod:hash名称(同hashlib.new())(默认md5)
  hc = hmac.new(b"key")

  # hmac对象
  hc.update(b"msg") # 字节缓冲区 hc.update(a) hc.update(b) == hc.update(a+b)
  hash_bytes = hc.digest() # 字节hash
  hash_str = hc.hexdigest() # 16进制hash字符串
  hc = hc.copy() # 拷贝hmac副本
  num = hc.digest_size # hash大小
  num = hc.block_size # hash算法内部块大小
  strs = hc.name # hash名称
  # hmac.compare_digest(a, b) // 比较两个hash密钥是否相同, 参数可为: str / bytes-like object, (注:建议使用,不建议使用a==b)
  boolean = hmac.compare_digest(hmac.new(b"net", b"luzhuo.me").digest(), hmac.new(b"net", b"luzhuo.me").digest())

 


if __name__ == "__main__":
  hmac_demo()

  # hmac_func()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python with statement 进行文件操作指南
Aug 22 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
python如何修改装饰器中参数
Mar 20 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 #Python
深入理解Python3 内置函数大全
Nov 23 #Python
Python内置函数delattr的具体用法
Nov 23 #Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 #Python
Python3 操作符重载方法示例
Nov 23 #Python
Python3安装Scrapy的方法步骤
Nov 23 #Python
Python 和 JS 有哪些相同之处
Nov 23 #Python
You might like
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
利用python打开摄像头及颜色检测方法
2018/08/03 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
进步之星获奖感言
2014/02/22 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书