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进制 ...
随机推荐
- 数据库-用户管理与pymysql
mysql用户管理 !这是dba的活儿!,但是万一公司没有dba? mysql用户指的是什么? 我们每一次在操作前都需要指定账号和密码,这个账号就是mysql的用户; 为什么要管理? 一个公司不可能只 ...
- django6-orm进阶操作
1.创建django环境的脚本 在自定义脚本中操作orm ,但是自定义脚本中不具备django的环境 ###test.py 脚本,引入django的环境即可使用orm操作数据库import os if ...
- 区块链社交APP协议分析:BeeChat
- BeeChat是什么 - BeeChat报文情况 BeeChat使用过程中产生的报文如下: 可以看到,其使用443端口,但内容并非SSL承载,格式不符合SSL,内容中含MsgNtf等明文串,但大部 ...
- 移动OA办公——Smobiler第一个开源应用解决方案,快来get吧
产品简介 SmoONE是一款移动OA类的开源解决方案,通过Smobiler平台开发,包含了注册.登陆.用户信息等基本功能.集成了OA中使用场景较多的报销.请假.部门管理.成本中心等核心功能. 免费获取 ...
- ubuntu安装cairo
查看网上大神们的各种安装经过,最后google之后执行下面两句就搞定了:apt-get install python-cairo apt-get install libcairo2
- Python—序列化和反序列化模块(json、pickle和shelve)
什么是序列化 我们把对象(或者变量)从内存中变为可存储或者可传输的过程称为序列化.在python中为pickling,在其他语言中也被称之为serialization,marshalling,flat ...
- docker卷管理(四)
什么是数据卷 overlay2存储卷 docker镜像是由多个只读层叠加而成,启动容器时,docker会加载只读镜像层,并在镜像栈顶部添加一个可写层 如果运行中的容器修改了现有的一个已存在文件,那该文 ...
- 3.Java基础_Java变量
/* 变量定义格式 数据类型 变量名=变量值 基本数据类型: byte,short,int,long,float,double,char,boolean 变量的使用: 取值格式: 变量名 修改值格式: ...
- LeetCode 268. Missing Number缺失数字 (C++/Java)
题目: Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is mi ...
- P2P中的NAT穿越(打洞)方案详解
一.P2P(点对点技术) 点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 点对点技 ...