关于python:Python模块学习-hashlib模块

3次阅读

共计 5198 个字符,预计需要花费 13 分钟才能阅读完成。

一:hashlib 简介

1、什么叫 hash: hash 是一种算法(不同的 hash 算法只是复杂度不一样)(3.x 里代替了 md5 模块和 sha 模块,次要提供 SHA1, SHA224, SHA256, SHA384, SHA512,MD5 算法),该算法承受传入的内容,通过运算失去一串 hash 值
2、hash 值的特点是(hash 值 / 产品有三大个性:)

  • 2.1、只有传入的内容一样,失去的 hash 值必然一样 =====> 要用明文传输密码文件完整性校验
  • 2.2、不能由 hash 值返解成内容 =======》把明码做成 hash 值,不应该在网络传输明文明码(只能有内容返回 hash 值)
  • 2.3、只有应用的 hash 算法不变,无论校验的内容有多大,失去的 hash 值长度是固定的(如从网上下载文件要进行 hash 校验,保障网络传输没有丢包)

基于 2.1 和 2.3 能够做文件下载一致性的校验
基于 2.1 和 2.2 能够对用户明码进行加密
hash 算法就像一座工厂,工厂接管你送来的原材料(能够用 m.update()

为工厂运送原材料),通过加工返回的产品就是 hash 值

二:将指定的“字符串”进行加密。应用 hashlib 的分步解析

1)在进行 md5 哈希运算前,须要对数据进行编码,否则报错

import hashlib
obj = hashlib.md5()   #结构一个 hashlib 的对象
obj.update("小马过河")  #update 对指定字符串进行加密
print(obj)           
-------------- 后果:obj.update("小马过河")
TypeError: Unicode-objects must be encoded before hashing

2)obj 是 hash 对象

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
print(obj,type(obj))
------------------- 后果:<md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>

3)

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
result=obj.hexdigest()
print(result)
-------------- 后果:24f67b0f6d02adc8867d612e0e0fc40a

4)给加密削减难度

import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8"))  #增加一些内容,进步加密复杂度。此处的字符串也要先编码,obj.update("小马过河".encode('utf-8'))
result = obj.hexdigest()
print(result)
------------------- 后果:b11740508f28e04837f2c0e3a58cf990

5)用 hashlib 做成加密函数(增加根底的字符了的)

import hashlib
def get_md5(data):   #传参为须要加密的字符串
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()          
    return result
val = get_md5('123')
print(val)
-------------- 后果:35093270b6352fa9721370b781f7b4d7

三:利用场景案例:用户账号密码登录,对明文明码进行加密

import hashlib
USER_LIST = []
def get_md5(data):
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
def register():
    print('************** 用户注册 **************')
    while True:
        user = input('请输出用户名:')
        if user == 'N':
            return
        pwd = input('请输出明码:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)
def login():
    print('************** 用户登陆 **************')
    user = input('请输出用户名:')
    pwd = input('请输出明码:')

    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True
register()
result = login()
if result:
    print('登陆胜利')
else:
    print('登陆失败')
------------------------ 后果:************** 用户注册 **************
请输出用户名: 小马过河
请输出明码:123456
请输出用户名:N
************** 用户登陆 **************
请输出用户名: 小马过河
请输出明码:123456
登陆胜利

用户登录场景剖析:实现用户注册,而后进行用户登录的代码剖析。

代码剖析:

1、用户登录须要应用明码,明码肯定要加密,保障用户的信息安全。
1)加密能够应用 hashlib 模块进行加密。
2)加密能够写成加密函数
3)进步明码解密的复杂性,代码中多加字符串。(加密算法尽管仍然十分厉害,然而也存在缺点,即:通过撞库能够反解。所以,有必要对加密算法中增加自定义 key 再来做加密。)
2、用户注册写成用户注册的函数,用户登录写成用户登录的函数。
3、先执行用户注册的函数,再执行用户登录的函数
4、注册与登录须要交互,用到 input 函数接管用户输出
5、如果用户注册和用户登录用到死循环,那么就要判断用什么来终止循环(比方这里是输出 N)
6、用户注册提交的明码加密的密文写入数据库。、用户注册提交的明码加密的密文写入数据库。
7、用户登录输出的明码,应用雷同加密函数加密后与数据库密文比对,相等就登录,否则就失败
8、登录的实质是判断从用户接管的加密后密文和注册时存入数据库的密文比照,用户名密文比照胜利,则持续往下执行登录后的操作。
9、用户输出明码要避免旁人看到,能够应用 getpass 模块
10、与明码相干的很重要,肯定要加密。包含本人领有的影响大的重要数据也要加密,避免黑客入侵获取而泄密。

四、校验文件的一致性(如何保障下载的文件过程中不丢包,保障下载数据的完整性)

# ----------- 文件统一校验 ----------------
'''能够拷贝一个文件放在两个不同的盘中,而后通过判断两个文件的 hash 值是否相等,判断两个文件是否是同一个文件'''
import hashlib
m = hashlib.md5()
with open(r'G:/logging 模块配图.png','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest())          #47a6b079cc33a4f312786b46e61e0305

import hashlib
m = hashlib.md5()
with open(r'H:/logging 模块配图.png','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest())

五、对明文明码进行加密

# 利用:对明文明码进行加密(暴力破解 ------- 用明文明码用一种算法算出一个 hash 值,与截取的 hash 值进行比对,比对胜利阐明明文明码统一,就能够破解用户的明码)'''如用户在某网站进行注册信息,这个时候避免信息被歹意拦挡获取,能够对用户明文明码进行加密,存成 hash 值得模式,这样用户每次登陆尽管输的是明文明码,校验 hash 值即可'''
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest())             #00dcbdaede875d5e23f1f9f64c7849ef


# 对明码进行加盐(暗号)---------- 进一步增强明码的安全性
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update('一行白鹭上青天'.encode('utf-8'))         #对明码加盐
m.update(password.encode('utf-8'))
print(m.hexdigest())

六、破解用户注册的明码

# 重点
'''模仿撞库破解明码'''
import hashlib
passwds=[                      #能够通过 random 实现对 passwds 中的内容
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
    ]

def make_passwd_dic(passwds):                #通过明文明码列表,造出与之对应的 hash 值得字典
    dic={}
    for passwd in passwds:
        m=hashlib.md5()                      #应用 md5 算法,造了一个工厂
        m.update(passwd.encode('utf-8'))     #给工厂运送原材料(即咱们要加密的内容)
        dic[passwd]=m.hexdigest()            #产出 hash 值(即最终的产品),将其退出到咱们当时造好的空字典中,字典模式:{明码:hash 值}
    return dic

def break_code(cryptograph,passwd_dic):      #判断拦挡的 hash 值是否与字典中当时造好的 hash 值相等,相等则阐明胜利进行破解
    for k,v in passwd_dic.items():
        if v == cryptograph:
            print('明码是 ===>\033[46m%s\033[0m' %k)

cryptograph='aee949757a2e698417463d47acac93df'     #咱们拦挡拿到的明码,通过加密的 hash 值
break_code(cryptograph,make_passwd_dic(passwds))   #将要破解的明码 hash 值,和当时造好的 hash 的字典当做函数的实参传给对应的形参

六、hmac 模块的加密形式,与 hashlib 相似

'''python 还有一个 hmac 模块,它外部对咱们创立 key 和 内容 进行进一步的解决而后再加密:'''
import hmac
h = hmac.new('天王盖地虎'.encode('utf8'))          #hmac 必须要加盐
h.update('hello'.encode('utf8'))
print(h.hexdigest())                 #1abaae8f65f68f2695a8545c5bc8e738

#要想保障 hmac 最终后果统一,必须保障:#1:hmac.new 括号内指定的初始 key 一样
#2: 无论 update 多少次,校验的内容累加到一起是一样的内容

# 上面单重形式失去的后果是一样的
import hmac
h1=hmac.new(b'tom')          #初始值必须保障统一,最终失去的后果就会不一样
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())

h2=hmac.new(b'tom')         #初始值必须保障统一,最终失去的后果就会不一样
h2.update(b'helloworld')
print(h2.hexdigest())

h3=hmac.new(b'tomhelloworld')   #初始值不一样,所以与下面两种的后果不一样
print(h3.hexdigest())

'''
0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e
'''

文末福利

点击支付 2020Python 材料合集,视频 & 电子书

正文完
 0