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

作者:LZ_Luzhuo 时间:2022-07-02 08:13:52 

以下代码以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()

来源:http://blog.csdn.net/rozol/article/details/72566661

标签:Python,hashlib,hmac,加密
0
投稿

猜你喜欢

  • Python探索之自定义实现线程池

    2021-10-09 08:28:11
  • 用Python抢火车票的简单小程序实现解析

    2023-09-06 06:31:28
  • Python判断以什么结尾以什么开头的实例

    2021-07-31 06:42:58
  • javascript打印html内容功能的方法示例

    2024-04-25 13:13:23
  • 如何用css制作有趣的按钮

    2008-03-17 13:54:00
  • 利用Python中的内置open函数读取二进制文件

    2022-02-26 21:00:47
  • 举例详解Go语言中os库的常用函数用法

    2024-05-08 10:43:53
  • 解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题

    2021-08-09 00:56:29
  • SQL server 2016 安装步骤图文教程

    2024-01-26 07:55:59
  • 如何用Python搭建gRPC服务

    2023-02-08 16:00:54
  • asp学习入门基本语法知识

    2007-11-07 14:02:00
  • jQuery 横向滚动图片

    2009-03-11 13:09:00
  • 使用python生成大量数据写入es数据库并查询操作(2)

    2024-01-14 02:10:27
  • python3 判断列表是一个空列表的方法

    2022-02-03 09:40:07
  • 详细介绍Scrapy shell的使用教程

    2022-04-18 03:35:39
  • PyCharm 配置远程python解释器和在本地修改服务器代码

    2023-01-05 05:36:06
  • Python 数据科学 Matplotlib图库详解

    2022-09-24 15:18:34
  • MySQL模糊查询用法大全(正则、通配符、内置函数)

    2024-01-22 13:48:50
  • Go语言中的UTF-8实现

    2024-04-25 15:30:51
  • Python控制浏览器自动下载歌词评论并生成词云图

    2022-04-17 11:24:56
  • asp之家 网络编程 m.aspxhome.com