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进制 ...
随机推荐
- Java生鲜电商平台-微服务入门与服务的拆分架构实战
Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...
- c# 打印的问题总结
近期 做了一个打印的类,有一下功能: /// <summary> /// 打印数据表格的类 /// 2016/05/19 @佳序 /// 功能: /// 01.自动 ...
- iOS UItableview 镶嵌 collectionView ,cell 自适应高度动态布局
最近在写这个功能,之前看到很多,可是需求一直没有涉及到,大致思路是有的,发现,网上的大部分都有缺陷和bug,我也是好无语啦啦啦,也不晓得是不是升级 了xcode,一样的代码,允许的效果都不一样,,,苦 ...
- 【Android】Context的使用
Android开发经常需要使用Context来启动Activity,或者打开SharedPreferences,或者构建一个Dialog.最近老是用到getContext(),getApplicati ...
- 中文代码之Django官方入门:建立模型
参考编写你的第一个 Django 应用,第 2 部分 创建项目后,首先用中文命名应用: $ python3 manage.py startapp 投票 之后在models.py建立模型,其他各种相关配 ...
- SQL注入漏洞技术的详解
SQL注入漏洞详解 目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 Up ...
- [Linux] 解决nginx: [emerg] directive "rewrite" is not terminated by ";"
解决nginx: [emerg] directive "rewrite" is not terminated by ";"nginx的rewite规则有时候没注 ...
- 使用Apache服务部署静态网站2019-7-5
使用Apache服务部署静态网站 第1步:把镜像挂载到系统中 第2步:使用vim文件编辑器创建YUM仓库的配置文件 [root@study ~]# vim /etc/yum.repos.d/abc.r ...
- JAVA字符串截取与求模
public class splitdemo { /** * @param args */ public static void main(String[] args) { // TODO Auto- ...
- python3.5.3rc1学习一
print ("Hello Pythoh3")print('我喜欢"香蕉"')print('we\'ar go to shoping.')print(" ...