参考链接: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. C++ 手把手教你实现可变长的数组

    01 实现自定义的可变长数组类型 假设我们要实现一个会自动扩展的数组,要实现什么函数呢?先从下面的main函数给出的实现,看看有什么函数是需要我们实现的. int main() { MyArray a ...

  2. qt构建错误: dependent "*.h" does not exist.

    项目中需要维护一套qt工程,今天发现一个头文件名称中单词拼写错误,就改正了,结果重新构建提示: dependent "*.h" does not exist. 原因:修改了文件后, ...

  3. 《0day安全软件漏洞分析技术》学习笔记

    最近因为工作需要在看0day的软件漏洞分析,发现这本<0day安全软件漏洞分析技术(第2版)>真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践, ...

  4. 关于MySQL的一些骚操作——提升正确性,抠点性能

    概要 回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的. 假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的. 为了准备,创建测试数据表(建表语句中默认使用utf8mb4以及utf8 ...

  5. 4.JavaCC处理中文字符

      要使JavaCC能够处理中文首先需要将语法描述文件的options块的UNICODE_INPUT选项设置为true: options { STATIS = false; DEBUG_PARSER ...

  6. Pycharm/Webstorm 上传和下拉 GitHub 项目

    操作流程:Pycharm和Webstorm的操作页面类似,本文以Webstorm为例 1.打开Webstorm软件选择 Settings 2.在Version Control 中填写 Git 的可执行 ...

  7. 安装fiddler后,willow安装

    willow 安装需要与fiddler安装在同一个磁盘,如果出现报错找不到路径,请按下面地址下载willow后重新安装 willow下载地址: https://github.com/QzoneTouc ...

  8. PHP注释标记整理

    什么是注释标记 我们在平常写代码或看别人写的代码时, 在方法的说明注释中经常会有这样的注释: /** * @param $num * @return array */ 上面的@param @retur ...

  9. C++ trais技术 模板特化的应用

    // traits 的应用 /////////////////////////////////////////// // traits template <typename T> clas ...

  10. NOIP模拟赛1(one)

    题目描述 Description 很久以前,有一个序列,序列里填了一些非负整数. \(zzq\) 每次可以选择序列的一个前缀,把这个前缀里的数都-1,如果这个前缀 中有 0 操作就无法进行. \(zz ...