Py002-02-08常用模块七(hashlib)

加密算法介绍

HASH

一种将任意长度的消息压缩到某一固定长度的消息摘要的函数

不可逆,也就是无法通过hash值反推原数据信息

1
2
3
4
5
6
# 第一次运行
hash('hjx') # 4843833162619343159
# 第二次运行
hash('hjx') # 3179283320655676208
# 第三次运行
hash('hjx') # -1078172669992245685

结论:每次对同一内容进行hash后 值是不同的(大多数情况下)

MD5

基于hash的,一种加密算法。

MD5功能

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);

也就是16位字符的信息

MD5算法的特点

  • 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
  • 容易计算:从原数据计算出MD5值很容易
  • 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
  • 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5算法是否可逆?

MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib

m = hashlib.md5()

m.update(b'hjx')
a = m.hexdigest()

print(a) # ffd529f6b20aff2291bf876c68433e78

# 长度32的16进制字符 我们知道两个16进制数代表一个字节 所以就是32/2 = 16字节
# 一字节8位 所以 正好是16*8 = 128位

# 而且这个md5值 不管在任何语言任何平台生成的值都是一样的,不变的

生活实例:支付宝密码如 if123456

你肯定会担心,支付宝的后台维护人员知道我的密码,到时候他跑路了,盗取账号咋办?

  1. 你的密码在支付宝数据库里存的不是明文 if123456
  2. 存的是类似 md5 的形式。[ffd529f6b20aff2291bf876c68433e78]
  3. 支付宝维护人员看到这个 md5 值也没有用,因为他拿这个 密码的md5值 [ffd529f6b20aff2291bf876c68433e78] 登录你的支付宝就会又进行一次md5 加密 生成新的值[87a28ad32d3dc1747c2c65c4dcc99e64]
  4. 肯定不是 if123456加密的值
    [ffd529f6b20aff2291bf876c68433e78] != [87a28ad32d3dc1747c2c65c4dcc99e64]

MD5用途

防止被篡改:

  • 比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。

  • 比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。

  • SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

防止直接看到明文:

  • 现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)

防止抵赖(数字签名):

  • 这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

网上的破解md5密码原理

实际上是撞库,它自己的数据库收集了常用密码生成的md5值,如果匹配上了就代表成功了,反之就破解不了