Python——hashlib&hmac(加密模块)

bytes类型数据——通过heashlib算法——固定长度的字符串。

核对两个文件是否相同,一般都使用MD5,而sha1是用于进行数据加密使用。(使用方法一样,就是md5改成sha1)

主要用于对字符串的加密,最常用的为MD5加密:

import hashlib

def get_md5(data):
    obj = hashlib.md5()
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
val  = get_md5('123')  #这里放入要加密的字符串文字。
print(val)
#简便的写法:
pwd = input('请输入密码:').encode('utf-8')
result = hashlib.md5(pwd).hexdigest()
#加盐写法:
import hashlib
date = 'hahahah'
ojb = hashlib.md5((date+'123123123').encode('utf-8')).hexdigest()
print(ojb)

 

import hashlib

md5 = hashlib.md5()
md5.update('Hello'.encode())
print(md5.hexdigest())

md5 = hashlib.md5()
md5.update('He'.encode())
md5.update('llo'.encode())
print(md5.hexdigest())

#这两个结果是一样的。不过update多少次。只要数据不变,那么都是一样的

如果要避免撞库的行为,可以加盐将加密数值改为更加复杂的,这样破译起来更加不容易。 

import hashlib

def get_md5(data):
    obj = hashlib.md5('abclasjd;flasdkfhowheofwa123113'.encode('utf-8'))  #这里加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
val  = get_md5('123')  #这里放入要加密的字符串文字。
print(val)

将大文件进行提取并使用hash取值方式:

import hashlib

def file_check(file_path):
    with open(file_path,mode='rb') as f1:
        shu256 = hashlib.sha256()
        while 1:
            content = f1.read(1024)
            if content:
                shu256.update(content)
            else:
                return shu256.hexdigest()
print(file_check('test.exe'))

案例:

说明:用户输入新建的用户名和密码,以MD5加密的形式存入文件中。再让用户输入用户名密码进行匹配。

#!/usr/bin/env python
# _*_ coding=utf-8 _*_
import hashlib
def get_md5(data):
    '''
    登录加密,将传入的密码进行加密处理,并返回值。
    :param data: 用户的密码
    :return: 返回MD5加密后的密码
    '''
    obj = hashlib.md5('abclasjd;flasdkfhowheofwa123113'.encode('utf-8'))  #这里加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
def seve_user(username,password):
    '''
    将加密后的密码和用户名进行保存,以| 来分割,文件为test.txt
    :param username: 需要创建的用户名
    :param password: MD5后的密码
    :return: 需要更改的地方,return判断是否保存成功。
    '''
    user_list = [username,get_md5(password)]
    lis = '|'.join(user_list)
    with open('test.txt',encoding='utf-8',mode='a')as f:
        f.write(lis+'\n')
def read_user(username,password):
    '''
    来判断用户登录所输入的用户名和是否正确。
    :param username: 用户输入的用户名
    :param password: MD5加密后的密码
    :return: 如果匹配返回True
    '''
    with open('test.txt',mode='r',encoding='utf-8') as f:
        for item in f:
            infomation = item.strip()
            user,pwd = infomation.split('|')
            if username == user and password == pwd:
                return True
while True:
    '''
    循环需要创建的用户
    '''
    user =input('请输入用户名:')
    if user.upper() == 'N':
        break
    pwd = input('请输入密码:')
    if len(user) and len(pwd) < 8:
      print('用户名密码不符合要求,请重新输入。')
    else:
        seve_user(user,pwd)
while True:
    '''
    循环用户登录
    '''
    user_name = input('请输入用户名:')
    password = input('请输入密码:')
    start_user = read_user(user_name,get_md5(password))
    if start_user:
        print('登录成功')
        break
    else:
        print('登录失败')

 

hmac

可以简化生成秘钥的过程,在进行有效性检测时可以使用。

import os
import hmac

random_key = os.urandom(32)   #随机生成的一个32字节
keys = b'hahaha'   #key

h = hmac.new(keys,random_key,'md5').digest()   
print(h)

#b"\xd5w\xd2jr]\\]Qgh!\xff'h\xc7"

 

posted @ 2019-12-17 12:34  新兵蛋Z  阅读(286)  评论(0编辑  收藏  举报