Python 摘要算法hashlib 与hmac
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017686752491744
摘要算法(也成为哈希算法)是用来防篡改的,因为我们的即使元数据改动一个字节,通过加密算法得出的摘要也会千差万别,从而我们可以比较两个文件的摘要,而得出这个文件是否被改动。
Python 内建模块hashlib提供了摘要算法
MD5
MD5是常见的摘要算法,速度很快,生成结果是固定的128bit字节,通常由32位的16进制字符串表示(因为一个16进制的字符恰好可以用4bit表示)
>>> import hashlib
>>> md5=hashlib.md5()
>>> md5.update('a'.encode('utf-8'))#要摘要的内容需要先编码为bytes,或者直接传入md5.update(b'a')
>>> print(md5.hexdigest())
0cc175b9c0f1b6a831c399e269772661
#如果要计算摘要的字符串太长,可以分多次摘要,结果是一样的
>>> md5.update('b'.encode('utf-8'))
>>> print(md5.hexdigest())
187ef4436122d1cc2f40dc2b92f0eba0
>>> hashlib.md5('ab'.encode('utf-8')).hexdigest()#另外一种调用方法
'187ef4436122d1cc2f40dc2b92f0eba0'
SHA1
SHA1是另外一种常见的摘要算法,他的使用方法和MD5一样,就是产生的摘要是160bit字节,通常用一个40位的16进制字符串表示。
SHA256和SHA512
这是比MD5和SHA1更安全的摘要算法,不过越安全的摘要算法越慢
摘要函数是一个单向函数,计算摘要很容易,但是由摘要反推出文件内容却非常困难,而且,对原始数据做1bit的修改,产生的摘要会大有不同。但是因为所有的摘要算法都是将无限的集合映射到有限的集合当中,所以也有可能是两个完全不一样的文件计算出一样的摘要,不过非常非常困难就是了。
摘要算法应用
将数据库中用户的明文密码改为摘要
将用户密码的摘要代替用户的明文密码,能极大的提高数据库泄露带来的风险,也能再数据库管理人员有访问权限的情况下保证账号安全,可以是这样也由一定的危险,以为黑客可以根据常用密码产生的摘要和数据库中的摘要进行比对,同样能得到用户的明文密码,
由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
def get_md5(password):
return hashlib.md5(password+'the_salt'.encode('utf-8')).hexdigest()
这样,即使用户的密码非常简单,黑客也不能根据他掌握的反推表退出用户的明文密码
但是如果有两个用户都使用了相同的简单口令比如123456
,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?
如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
Hmac
为了防止黑客通过彩虹表根据哈希值反推出用户的明文口令,在计算哈希值的时候,我们通常将用户的密码和一段被称为“盐"的特殊字符串一起生成的哈希值作为密码存储。
如果salt是我们自己随机生成的,通常我们计算MD5的时候通过md5(message+salt),但是如果把salt看作一个口令,计算加salt的哈希值其实就是,根据不同的口令计算出不同的哈希值,然后只有提供正确的口令,才能验证哈希值。
这实际上就是Hmac 算法:keyed-Hashing for Message Authentication。它通过一个标准的算法,在计算哈希值的时候,将key混入其中
我们需要准备:原始的messge、要添加的key、加密算法(这里采用MD5)
>>> import hmac
>>> message=b'hello world'
>>> key='screat'.encode('utf-8')
>>> h=hmac.new(key,message,digestmod='MD5')# 如果消息很长,可以多次调用h.update(msg)
>>> h.hexdigest() '41ab5984e2ecfa784767ea7216a8410b'
>>>
可见使用hmac和普通hash算法非常类似。hmac输出的长度和原始哈希算法的长度一致。需要注意传入的key和message都是bytes
类型,str
类型需要首先编码为bytes
。
Python 摘要算法hashlib 与hmac的更多相关文章
- python 加密 hashlib与hmac模块
https://www.jb51.net/article/128911.htm hashlib模块简介: hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 ...
- python 内置模块之hashlib、hmac、uuid
一.hashlib md5和sha算法通过消息摘要算法生成定长的消息摘要,消息摘要算法是不可逆的.但同一段消息通过摘要算法后得到的值是一样的,可一通过比对消息摘要验证数据的完整性. sha算法比MD5 ...
- Python之数据加密与解密及相关操作(hashlib、hmac、random、base64、pycrypto)
本文内容 数据加密概述 Python中实现数据加密的模块简介 hashlib与hmac模块介绍 random与secrets模块介绍 base64模块介绍 pycrypto模块介绍 总结 参考文档 提 ...
- python模块 加密服务hashlib,hmac
https://docs.python.org/zh-cn/3/library/hashlib.html hashlib --安全hash和消息摘要digest hmac -- keyed-Hashi ...
- Python hashlib and hmac
hashlib hashlib提供了常用的摘要算法:MD5, SHA1等等 摘要算法:也成哈希算法,散列算法.通过一个函数把任意长度的数据转换成一个长度固定的数据串.主要用在存储一些不能被修改和查看的 ...
- Python模块——HashLib(摘要算法)与base64
摘要算法(hashlib) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- python之hashlib、configparser、logging模块
hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...
- 通过python的hashlib模块计算一个文件的MD5值
Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值 ...
- Python模块hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...
随机推荐
- GO基础之函数
一.Go语言函数的格式 函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func.函数名.参数列表.返回值.函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块. 函 ...
- HTML中引用CSS的几种方法
HTML中引用CSS的方法主要有 行内样式 内嵌式 链接式 导入样式 行内样式 指写在标签里的Style元素的值 <p style="color: #FF0000;"> ...
- Chrome保存的HAR文件怎么打开?
- Chrome保存HAR 在Chrome中,在需要抓包的任意一个浏览器窗口,按F12,点Network页面,即可进入抓包界面,之后的所有网页交互操作产生的报文,都会在此列出. 在抓包的报文界面上右键 ...
- WKWebView使用遇到的坑--加载本地html及JS交互
1. ios9以前版本读取本地HTML的问题 当使用loadRequest来读取本地的HTML时,WKWebView是无法读取成功的,后台会出现如下的提示:Could not create a san ...
- 企业账号发布APP
做了一个公司内部人使用的项目,公司申请了企业开发者账号.现将企业开发者账号发布app的过成总结如下: 1.生成Certificate Signing Request (CSR)文件 2.2 请求Cer ...
- linux远程Windows服务器
Rdesktop -f ip 端口 Ctrl+alt+enter退出全屏
- Python—变量详解
变量赋值 a = 1 b = 2 c = 3 print a, b, c # 1 2 3 a = b = c = 1 print a, b, c # 1 1 1 a, b, c = 1, 2, 3 p ...
- K8S 1.14.6中,将kubeadm集群证书颁发时间延长到100年
更改两个文件,重新编译kubeadm. 1,D:\kubernetes-1.14.6\staging\src\k8s.io\client-go\util\cert\cert.go // NewSelf ...
- win10连接共享打印机
一.在运行中输入“\\共享打印机的主机ip”. 二.如果出现下面弹窗: 1.按Win键弹出开始菜单,直接在键盘上按zucelue,这个时候开始菜单里会检索到“编辑组策略”这个程序,按回车运行该程序.2 ...
- StringBuild
* StringBuild 初始容量是 32 * 1.属性: * Length:现有内容长度: * Capacity:StringBuild当前最大容量 * * 2. * 通过 设置Length=10 ...