使用Python模块:hashlib和hmac模块

哈希算法(也称摘要算法)的重要性不言而喻,在各种加密算法随处可见它的身影;本文要介绍的两个Python模块就是和哈希有关的内建模块


哈希的基本知识概要

哈希算法及其特点

哈希:也叫散列,摘要

输入:也叫预映射

哈希算法(Hash Algorithm):简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数;哈希算法是一种压缩映射,也就是说散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值

哈希的特点:1)只要输入一样,输出的哈希必然一样(用于文件、下载完整性校验),2)哈希算法不可逆,即使拿到哈希,也不能推出源文件,3)只要使用的哈希算法不变,无论校验的内容是否一样,得到的哈希长度是固定的

加盐

加盐(salt)加密(简称“加盐”)是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联

无论何时只要口令改变,随机数就改变;随机数以未加密的方式存放在口令文件中,这样每个人都可以读;不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中

彩虹表破解

彩虹表(rainbow table)是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备

一般主流的彩虹表都在100G以上;这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码;这是空间/时间替换的典型实践, 比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的破解方式储存空间少而处理时间多;使用加salt的KDF函数可以使这种攻击难以实现

关于Python3和Python2的区别

在Python3中,md5模块和sha模块都被合并到hashlib模块中去了


hashlib模块

hashlib模块是一个内置的Python模块

hashlib提供常见的摘要算法,如MD5,SHA1

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示

这里写图片描述

如上图所示,对于较大文件可以采取多次传输(多次调用update(bytes_obj)),这和一次性计算得到的hash值是一样的

另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似

先让我们看看hashlib有哪些关于sha的加密算法

这里写图片描述

从中选择一种进行验证

这里写图片描述


hmac模块

hamc算法(Keyed-Hashing for Message Authentication)通过一个标准算法在计算哈希的过程中,把key混入计算过程中

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1;采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全(说到底就是——加盐~实现key的哈希~)

在构造hmac对象时,要传入参数(这和hashlib.md5()不同,它可以之后再搞),在这之后和hashlib.md5()一样如果文件较大可以进行多次update(byte_obj)操作

这里写图片描述

可见使用hmac和普通hash算法非常类似,hmac输出的长度和原始哈希算法的长度一致

猜你喜欢

转载自blog.csdn.net/abc_12366/article/details/80425775