参考链接: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的更多相关文章

  1. python 加密 hashlib与hmac模块

    https://www.jb51.net/article/128911.htm hashlib模块简介: hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 ...

  2. python 内置模块之hashlib、hmac、uuid

    一.hashlib md5和sha算法通过消息摘要算法生成定长的消息摘要,消息摘要算法是不可逆的.但同一段消息通过摘要算法后得到的值是一样的,可一通过比对消息摘要验证数据的完整性. sha算法比MD5 ...

  3. Python之数据加密与解密及相关操作(hashlib、hmac、random、base64、pycrypto)

    本文内容 数据加密概述 Python中实现数据加密的模块简介 hashlib与hmac模块介绍 random与secrets模块介绍 base64模块介绍 pycrypto模块介绍 总结 参考文档 提 ...

  4. python模块 加密服务hashlib,hmac

    https://docs.python.org/zh-cn/3/library/hashlib.html hashlib --安全hash和消息摘要digest hmac -- keyed-Hashi ...

  5. Python hashlib and hmac

    hashlib hashlib提供了常用的摘要算法:MD5, SHA1等等 摘要算法:也成哈希算法,散列算法.通过一个函数把任意长度的数据转换成一个长度固定的数据串.主要用在存储一些不能被修改和查看的 ...

  6. Python模块——HashLib(摘要算法)与base64

    摘要算法(hashlib) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  7. python之hashlib、configparser、logging模块

    hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...

  8. 通过python的hashlib模块计算一个文件的MD5值

    Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值 ...

  9. Python模块hashlib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...

随机推荐

  1. 证书锁定SSL/TLS Pinning

    前言 APP端抓包中, 设置抓包代理后会发现部分APP(如app store.Facebook)直接无法访问,其他部分app又功能正常,为什么呢?这涉及 ssl-pinning,证书锁定. 证书锁定( ...

  2. SILK编码语音转WAV格式

    - SILK编码 SILK采样率可为8.12.16或24 kHz,比特率可为6至40 kbit/s.对应到报文层面的直观印象,即SILK编码的语音数据每帧长度是不等的. SILK编码已经开源,目前可下 ...

  3. iOS开发时获取第一响应者

    上篇中提到键盘相应时间中用到了获取当前第一响应者的方法是苹果的是有方法,无法上传到App Store,本文将介绍一种非常简单的且未用到私有API的方法来获取当前第一响应者. 实现思路:用到的iOS A ...

  4. Microsoft.Extensions.DependencyInjection 阅读笔记

    一. 关于IServiceCollection接口的设计 public interface IServiceCollection : IList<ServiceDescriptor> { ...

  5. zsh: command not found: 解决方法

    问题原有:mac中安装了my zsh [https://www.cnblogs.com/dadonggg/p/11027454.html] ,但是造成了在使用vscode的时候,提示”zsh: com ...

  6. Python—闭包和装饰器

    闭包 定义:内部函数对外部函数变量的引用,则将该函数与用到的变量称为闭包. 闭包必须满足以下三个条件: 必须有一个内嵌函数. 内嵌函数必须引用外部函数中的变量. 外部函数返回值必须是内嵌函数的引用. ...

  7. [视频教程] 配置vscode的PHP自动补全提示与使用Xdebug进行远程调试debug

    默认下载安装完的vscode并不能准确提示和检测PHP的语法错误,需要手动指定一下本机的PHP程序路径.按下面的操作配置完后就能在文件保存的时候检测语法有无错误.打开文件->首选项->se ...

  8. 六、CSS 选择器:BeautifulSoup4

    和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会局部遍历,而Beautiful Soup 是基 ...

  9. 执行 npm cache clean报错

    C:\Users\you name>npm cache cleannpm ERR! As of npm@5, the npm cache self-heals from corruption i ...

  10. xampp配置虚拟域名

    首先使用notpad++(我用的notpad++,记事本也可以)打开(安装xampp目录下的)apach-->conf-->extra-->httpd-vhosts.conf 在文件 ...