07-13 hashlib模块

一. 什么是哈希?

  • 哈希是一类算法。该算法接收传入的内容,经过运算得到一串哈希值。
  • 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值

二. 哈希值的3大特点及用途

"""
# 注意: 以下指得都是同一种hash算法
1. 同一种hash算法下, 只要传入的内容一样,得到的hash值必然一样
2. 不能由hash值返解成内容
	补充: 这里的返解指的是在一定程度上不能返解,目前有山东有一教授已经返解出了某种算法。所以说没有绝对的安全。
3. 同一种hash算法下,无论校验的内容有多大,得到的hash值长度是固定的
	
# hash的用途
    用途1:特点2用于密码密文传输与验证
    用途2:特点1、3用于文件完整性校验
"""

三. 验证: 同一种hash算法下, 只要传入的内容一样,得到的hash值必然一样

# 
"""
注意1: m.update()传值可以理解为搬运传值。这种类型的好处是在于,可以校验大文件。但是不好的一点就是这种每一次的搬运基于直接使用下面的那种方式效率上, 还是有影响。
注意2: hashlib.md5()中也能进行传值, 不过这种传值是一次性传值. 不好的一点就是不适合针对大文件的校验.
注意3: 哈希值校验的是bytes类型, 我们针对字符串需要进行编码, 编码类型随意, 并不影响哈希值。
"""
import hashlib
m = hashlib.md5()
m.update('Hello'.encode('utf-8'))  
m.update('World'.encode('utf-8'))
print(m.hexdigest())  # 'HelloWorld': 68e109f0f40ca72a15e05cc22786f8e6


m1 = hashlib.md5('He'.encode('utf-8'))  
m1.update('llo'.encode('utf-8'))
m1.update('Wor'.encode('utf-8'))
m1.update('ld'.encode('utf-8'))
print(m1.hexdigest())  # 'HelloWorld': 68e109f0f40ca72a15e05cc22786f8e6

四. 模拟撞库破解密码简单版

import hashlib

# 这里模拟简单的密码字典
passwds = [
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
]

cryptograph = 'aee949757a2e698417463d47acac93df'  # 这里模拟抓包获得的加密过后的密文密码。
dic = {}

# 这一对模拟简单的密码的字典进行加密, key存放明文密码。Value存放对应的密文密码。
for p in passwds:
    res = hashlib.md5(p.encode('utf-8'))
    dic[p] = res.hexdigest()

# 模拟撞库得到密码
for key, value in dic.items():
    if value == cryptograph:
        print('撞库成功,明文密码是:%s' % key)
        break

五. 提升撞库的成本: 密码加盐

import hashlib

m = hashlib.md5()

m.update('天王'.encode('utf-8'))
m.update('alex3714'.encode('utf-8'))
m.update('盖地虎'.encode('utf-8'))
print(m.hexdigest())

六. 实现大文件的高效率效验

# 大概率成面效验文件的完整性
"""
如果一个文件过大,我们需要哈希校验整个文件的内容, 从而得到一个哈希值。这个时候就会引发效率问题。我们可以通过"f.seek()"操作文件指针的跳转。每次固定一种规律,跳转几个间隔的字符进行一次, 固定大小内容的跳转,然后进行一次校验。以此类推,通过这种方式我们可以达到大概的层面校验文件的完整性。之前我们所说,读取文件有两种方式,一种是全部读出"f.read()",一种是以文件的每一行的方式去读出"for line in f"。这种时候如果文件内容过大,以每一行的方式去读出的话,效率这个时候是比较低,所以我们要使用"f.read(指定的读出的字节个数)", 这里我们要注意读出字节个数, 是因为哈希校验的是buys类型。而使用这种方式。能快速解决只能读取每一行的局限性。
"""
posted @ 2020-04-01 00:48  给你加马桶唱疏通  阅读(129)  评论(0编辑  收藏  举报