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查找相似单词的方法
Mar 05 Python
Android分包MultiDex策略详解
Oct 30 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
浅析PHP与Python进行数据交互
May 15 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
如何实现Django Rest framework版本控制
Jul 25 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
Python 从attribute到property详解
Mar 05 Python
python+OpenCV实现图像拼接
Mar 05 Python
Pycharm如何导入python文件及解决报错问题
May 10 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
Php部分常见问题总结
2006/10/09 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JavaScript 常用函数
2009/12/30 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
解决python对齐错误的方法
2020/07/16 Python
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
2014春晚主持词
2014/03/25 职场文书
导游个人求职信
2014/04/25 职场文书
结婚保证书范文
2014/04/29 职场文书
庆七一活动简报
2015/07/20 职场文书
情人节单身感言
2015/08/03 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL