hashlib模块  

用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

MD5 摘要输出

# ######## md5 ########
import hashlib hash = hashlib.md5() # 对字节计算md5
hash.update('admin'.encode()) # md5 bytes值输出:原始128位 输出其可打印字符 (ASCII中95个可打印字符直接显示,非可打印字符输出\x开头的16进制字符),总输出长度不固定
print(hash.digest())
输出:b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3' # md5 16进制字符串输出,长度固定32(128/4)个字符
print(hash.hexdigest())
输出:'21232f297a57a5a743894a0e4a801fc3' #MD5 加密后的位数一般为两种,16 位与 32 位。16 位实际上是从 32 位字符串中,取中间的第 9 位到第 24 位的部分
hash.hexdigest()[8:24]
输出:'7a57a5a743894a0e'

更多案例:

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...") print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of binary data. """
pass def hexdigest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of hexadecimal digits. """
pass '''
import hashlib# ######## sha1 ######## hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())
128位md5 digest,

还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

散列消息认证码,简称HMAC

消息认证码MAC(Message Authentication Code)是一种确认完整性并进行认证的技术,简称为MAC。消息认证码的输入包括 任意长度的消息和一个发送者与接受者之间 共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值。要计算MAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。

HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。

HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。

使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

1、HMAC计算步骤解析

示意图:

图解:

1. 密钥填充

如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

2. 填充后的密钥与ipad的XOR

将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。

XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

3. 与消息组合

随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

4. 计算散列值

将3的结果输入单向散列函数,并计算出散列值。

5. 填充后的密钥与opad的XOR

将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

6. 与散列值组合

将4的散列值拼在opadkey后面。

7. 计算散列值

将6的结果输入单向散列函数,并计算出散列值,这个散列值就是最终的MAC值。

通过上述流程可以看出,最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。

2、HMAC 举例

# hmac.new(key,msg,digestmod)
# key:加盐的key,
# msg:加密的内容,
# digestmod:加密的方式

1. hmac消息签名(默认使用MD5加算法)

import hmac

# 默认使用是md5算法
digest_maker = hmac.new('secret-shared-key'.encode('utf-8'))
with open('test3.html', 'rb') as f:
while True:
block = f.read(1024)
if not block:
break
digest_maker.update(block)
digest = digest_maker.digest()
hexdigest = digest_maker.hexdigest()
print(digest)
print(hexdigest)

示例输出:

b'U\xe8\xb5\x9c\xf5\xc3\xbe\xa8VTM,N\xdb\xaaN'
55e8b59cf5c3bea856544d2c4edbaa4e

2. hmac消息签名摘要(使用SHA1加算法)

import hmac

# 使用SHA1算法
digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), b'', digestmod='SHA1')
# digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), b'', digestmod=hashlib.sha1) # import hashlib
# hmac.new(key,msg,digestmod)
# key:加盐的key,
# msg:加密的内容,
# digestmod:加密的方式
with open('test3.html', 'rb') as f:
while True:
block = f.read(1024)
if not block:
break
digest_maker.update(block)
digest = digest_maker.digest()
hexdigest = digest_maker.hexdigest()
print(digest)
print(hexdigest)

示例输出

b'C?\xb2\xe2\xdeW\n\xb7\xe1\x08\xef\xa7{\xa6\xb43\x10\xc9\xcb\xa2'
433fb2e2de570ab7e108efa77ba6b43310c9cba2

鸣谢:https://blog.csdn.net/chengqiuming/article/details/82822933

鸣谢:http://www.cppcns.com/jiaoben/python/295086.html

更多关于md5,sha1,sha256等介绍的文章看这里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html

hashlib加密模块主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,HMAC消息签名(HMAC-SHA1,....)的更多相关文章

  1. 可以进行SHA-1,SHA-224,SHA-256,SHA-384,SHA-512五种算法签名的工具类,以及简单说明

    import java.security.MessageDigest; public class SignatureSHA { public static String signSHA(String ...

  2. Windows10计算文件SHA1 SHA256 SHA384 SHA512 or MD5

    目录 Windows10计算文件SHA1 SHA256 SHA384 SHA512 or MD5? 1.计算SHA1 2.计算SHA256 3.计算SHA384 4.计算SHA512 5.计算MD5 ...

  3. python hashlib模块 md5加密 sha256加密 sha1加密 sha512加密 sha384加密 MD5加盐

      python hashlib模块   hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, ...

  4. hashlib加密模块和logging模块,购物车项目

    hashlib加密模块 简介 hashlib模块是一个提供了字符串加密功能的模块,包含MD5和SHA的加密算法.具体的加密支持有: MD5,sha1,sha224,sha256, sha384, sh ...

  5. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  6. python: hashlib 加密模块

    加密模块hashlib import hashlib m=hashlib.md5() m.update(b'hello') print(m.hexdigest()) #十六进制加密 m.update( ...

  7. 第三十七节,hashlib加密模块

    在使用hashlib模块时需要先 import hashlib 引入模块 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA ...

  8. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  9. Python hashlib加密模块

    hashlib模块 简介: hashlib模块是一个提供了字符串加密功能的模块,包含MD5和SHA的加密算法.具体的加密支持有: MD5,sha1,sha224,sha256, sha384, sha ...

随机推荐

  1. 如何查看dpdk版本

    服务器上曾经装过很多版本的dpdk,此时如果编译某个程序出现奇怪错误的时候不由得会怀疑是不是dpdk版本的问题= = 令人吃惊的是,网上搜了一圈居然没有一个简单直接的方法能够直接使用,于是自己实验了一 ...

  2. Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<Spring Cloud Gat ...

  3. CF#581 (div2)题解

    CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include< ...

  4. Atcoder Grand Contest 034 F - RNG and XOR(FWT)

    Atcoder 题面传送门 & 洛谷题面传送门 tsc 考试前 A 的题了,结果到现在才写这篇题解--为了 2mol 我已经一周没碰键盘了,现在 2mol 结束算是可以短暂的春天 短暂地卷一会 ...

  5. KEGG数据库整理示例

    已知KEGG数据库中ko_map.tab文件,K-->ko: 目标文件:map-->K 代码示例: #! /usr/bin/perl -w use strict; my %seq; ope ...

  6. dokuwiki使用随笔

    1. 在dokuwiki上安装MataJax插件后: a. $....$:之间书写数学公式;如完全平方公式:$a^2+b^2+2ab$,该公式将与当前行文字处于同一行; b. $$ .... $$ 之 ...

  7. /etc/sudoers 文件

    sudo的权限控制可以在/etc/sudoers文件中查看到 如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时不需要输入密码 格式一般都是 ro ...

  8. 巩固javaweb第十五天

    巩固内容: 单选按钮: 在注册功能中,用户选择学历使用的是单选按钮,并且是多个单选按钮,每个选项对 应一个单选按钮,用户只能选择其中一个,这多个单选按钮的格式相同.如果用户要输入 的信息只有少数几种可 ...

  9. Java项目发现==顺手改成equals之后,会发生什么?

    最近发生一件很尴尬的事情,在维护一个 Java 项目的时候,发现有使用 == 来比较两个对象的属性, 于是顺手就把 == 改成了 equals.悲剧发生...... == 和 equals 的区别 = ...

  10. 日常Java 2021/10/27

    java HashMap HashMap是一个散列表,它存储的内客是键值对(key-value)映射.HashMap实现了Map.接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许 ...