hashlib模块

hashlib铺垫知识

hash指加密,我们将一串字符串明文加密为密文,使这段密文难以被识别,也无法倒推成明文,这就是加密。

hashlib模块所提供的加密,如我们最常用的md5加密方式,其加密效果就是:传入相同的一段明文,加密后会输出相同的一段密文。

应用场景

而加密常用于密码校验等领域。当我们的密码通过网络传输时,可能会被截取,暴露我们的用户名密码,这十分的不安全,而在密码通过网络传输前,如果将密码的明文加密为密文,这样即使我们的密码密文被截取,也不会造成我们的信息泄露。

也可以用于文件安全性检测,文件一致性检测等,这个在下文中会提及其实现的原理。

常见的加密算法

常见的加密算法有:md5、base64、hmac、sha系列

hashlib模块的使用

基础用法

import hashlib  

# 1.得到一个加密器,采取md5的策略加密
hasher = hashlib.md5()
# 2.给加密器 传入明文
hasher.update('我是一串明文字符串'.encode('utf8'))  # 明文必须编码成二进制才能被加密
# 3.从加密器 获取密文
cipher = hasher.hexdigest()
print(cipher)  # 3d6c18389bc1433e6f1c9ef80d3bceac

这样就成功将一段明文加密成了一段密文。

补充说明

md5具体执行什么算法,我们无从得知,我们只需要掌握:

  • 同样的明文被加密后得到的密文是一样的
  • 我们无法通过密文得到对应的明文
  • md5策略拿到的所有密文长度是固定的
hasher = hashlib.md5()
# 我们不仅可以一次性传入明文  hasher.update('我是一串明文字符串'.encode('utf8'))
# 也可以分段传入明文
hasher.update('我是一串'.encode('utf8'))
hasher.update('明文'.encode('utf8'))
hasher.update('字符串'.encode('utf8'))
cipher2 = hasher.hexdigest()
print(cipher2)  # 3d6c18389bc1433e6f1c9ef80d3bceac  与上文中的密文比较别无二致

加盐处理

虽然我们无法通过密文反解明文,但是由于明文只对应一种密文,所以我们可以通过猜很多明文的方式,得到一个明文和密文的对照表,这样一些常见的明文组合就可能被对照表破解出来,这种行为叫做撞库。

所以我们可以选择在明文中添加一些干扰项,来加大撞库的难度,这种方式又被叫做加盐。

import hashlib

hasher = hashlib.md5()

hasher.update('前面加一勺盐'.encode('utf8'))  # 前面拼接了一段内容
hasher.update('明文密码'.encode('utf8'))
hasher.update('后面再加一勺盐'.encode('utf8'))  # 后面也拼接了一段内容

cipher = hasher.hexdigest()

应用在密码校验时,密码明文夹杂干扰项被翻译成密文存储在服务器的库中,当用户输入密码时,程序会添加相同的干扰项,加密成同样的密文用于校验。

对于想要撞库的人来说,不仅要撞出明文,还要猜测哪部分是盐分。

如果还想更加安全,则可以采取动态加盐的方式。

import hashlib
username = input('username>>:').strip()
password = input('password>>:').strip()

hasher = hashlib.md5()

hasher.update(username[::3].encode('utf8'))  # 取用户名的一部分做盐分
hasher.update(password.encode('utf8'))  # 密码


cipher = hasher.hexdigest()
print(cipher)

文件安全性\一致性检测

当我们通过网络传输(上传/下载)文件时,文件可能会被添油加醋,一时间无法辨认,如我们下载的软件安装包里被植入木马什么的。

这时我们在传输文件时,先传文件通过加密得到的一小段密文过去,然后文件传输完成后,再次对文件加密得到一段新的密文,这段密文如果与先前传的一致,说明这个文件没有被篡改。

当然如果是比较大的文件,我们对其进行加密,可能会消耗比较多的资源。这时可以取文件的某些部位进行分段加密校验即可,如头尾,中间段各取100个字节进行加密即可,这种策略可以显著提升文件一致性检测的效率。

原文地址:http://www.cnblogs.com/Leethon-lizhilog/p/16832850.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性