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之import机制详解
Jul 03 Python
Python重新引入被覆盖的自带function
Jul 16 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
python套接字流重定向实例汇总
Mar 03 Python
Python实现感知机(PLA)算法
Dec 20 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
Python 中@property的用法详解
Jan 15 Python
keras中的backend.clip用法
May 22 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Python子进程subpocess原理及用法解析
Jul 16 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得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
Vue实现手机计算器
2020/08/17 Javascript
JS如何生成动态列表
2020/09/22 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
养殖项目策划书范文
2014/01/13 职场文书
个人优缺点自我评价
2014/01/27 职场文书
入党自我鉴定
2014/03/25 职场文书
公务员保密承诺书
2014/03/27 职场文书
中学生演讲稿
2014/04/26 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
利用python做数据拟合详情
2021/11/17 Python
详解python的异常捕获
2022/03/03 Python