Python3 加密(hashlib和hmac)模块的实现
作者:LZ_Luzhuo 发布时间:2022-07-02 08:13:52
以下代码以Python3.6.1为例
hashlib : 不可逆加密
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


猜你喜欢
- DQL简介概念:DQL(data query language)数据查询语言 select操作排序规则:- select 表达式1|字段,.
- 最近需要做一个表格样式,需要组合表头,现在把做出来的分享给大家, 1、效果图2、html代码 <table id="
- 一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时
- 这篇文章主要介绍了python智联招聘爬虫并导入到excel代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 请问,如何在ACCESS数据库和SQL SERVER数据库中查询?
- 效果展示效果展示素材展示一个为视频,另一个为像素大小不小于视频的封面。实现过程调用已启用的浏览器通过调用已启用的浏览器,可以实现直接跳过每次
- 准备工作: ① 首先要会使用ThinkPHP这个框架 ② 最好有些ajax的基础(可以去看下小飞的另外一篇博文:Ajax实时验证"
- 由于测试环境上面使用的zabbix服务器配置比较低,经常会遇到性能瓶颈(主要是数据库和磁盘I/O等),于是倒逼我使用了一些方式来缓解这些问题
- 有的时候,我们需要读取图片名,写入表格中,以便结合图片的其他信息,做进一步的分析。假如,现在要读取存放在E盘的origin_file文件夹,
- 前言随着人工智能的不断发展,各种智能算法越来越普遍,本文就给大家介绍一种通过训练好的算法进行文字识别的方法,而且是Web页面可视化操作,方便
- 1.什么是Proxy?它的作用是?据阮一峰文章介绍:Proxy可以理解成,在目标对象之前架设一层 "拦截",当外界对该对
- asp代理采集代码如下:<%Function ProxyPage(url) Set Retrieval&
- 迭代器聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一
- 把文件夹dir1中后缀为'.jpg'的文件拷贝到文件夹dir2中:import globimport shutilimpor
- MySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面就教您修改MySQL日志文件
- 本文实例为大家分享了python实现knn算法的具体代码,供大家参考,具体内容如下knn算法描述对需要分类的点依次执行以下操作:1.计算已知
- 如下所示:screen.widthscreen.heightscreen.availHeight //获取去除状态栏后的屏幕高度screen
- xlsxwriter可能用过的人并不是很多,不过使用后就会感觉,他的功能让你叹服,除了可以按要求生成你所需要的excel外还可以加上很形象的
- 在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求。作为前端开发工程师,以往我们开发的JavaScript
- 直接上代码:# -*- coding: utf-8 -*- import Queue import threadingimport urll