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实现根据图标提取分类应用程序实例
Sep 28 Python
python抽象基类用法实例分析
Jun 04 Python
python实现批量监控网站
Sep 09 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
python实现人像动漫化的示例代码
May 17 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python 详解turtle画爱心代码
Feb 15 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 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
jquery easyui使用心得
2014/07/07 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
原生js实现随机点名
2020/07/05 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
Python对象属性自动更新操作示例
2018/06/15 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
销售主管岗位职责
2014/02/08 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
企业形象策划方案
2014/05/29 职场文书
店长岗位职责
2015/02/11 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
教师思想工作总结2015
2015/05/13 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
Python如何用re模块实现简易tokenizer
2022/05/02 Python
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript