python 当中的 hashlib 模块 (md5方法使用)

在平时的接口测试当中,会遇到登录的密码或者其他请求参数会需要进行加密处理

这里写的是py当中的hashlib 模块,在模块内可进行查看md5的调用方法。

一般进行接口加密的要求:

1、对接口请求参数进行ASCII码排序

2、做url类型encode编码 (如:username & password & …)

3、最后做md5加密处理

#举例

data=xxxxx

import hashlib   

md5 = hashlib.Md5()

md5.update(data.encode("utf-8"))

print(md5.hexdigest())

 #函数形式

def get_md5(data):

    md5 = hashlib.md5("abcdefg")
    md5.update(data)
    r = md5.hexdigest()
    return r

那么这里就写一个简单的登录数据示例:

如:存在一个登录数据:userdata={"username":"qika","password":"123456"}

--->对参数进行ascii码排序:

userdata=dict ( sorted ( userdata.items(), key = lambda item : item[0] ) )

--->做url类型encode编码:

from urllib import parse         

data=parse.urlencode(userdata)

--->md5加密:

import hashlib   

md5 = hashlib.Md5()

md5.update(data.encode("utf-8"))

print(md5.hexdigest())

 写成一个函数:(动态获取参数加密)

userdata=xxxxxxx

def get_Md5(**kwargs):

  userdata=dict ( sorted ( userdata.items(), key = lambda item : item[0] ) )

  data=parse.urlencode(userdata)

  md5 = hashlib.Md5()

  md5.update(data.encode("utf-8"))

  return  md5.hexdigest()

实例:---------------------------------------------------

例1:
禅道登录接口:

import requests
import hashlib
def MD5_login(str):  #这里的参数:就是要加密的内容
    md5_qika= hashlib.md5()
    md5_qika.update(str.encode(encoding='utf-8'))
    return md5_qika.hexdigest()
password
= 'qika123456' #登陆密码:'qika123456',这也是马上要用来加密的内容 url = 'http://xxxx/zentao/login.html '

data = {'account':'qika','password':MD5_login(password),'referer':'/zentao/'} #这是对密码进行Md5加密,所以直接调用上面的方法 response = requests.post(url,data=data) # 发送post请求 print(response.content.decode('utf-8'))
例2:
用md5加密图片名字,爬取图片的时候防止图片重复出现。把它放到下载图片循环里,例如:

for ii in i.xpath('div/div/img/@data-original'):
    img_url = ii[2:]
    wei = img_url[-4:]
    md5 = hashlib.md5(wei.encode("gb2312"))
    listss = md5.hexdigest()
    if listss in ['.jpg','.gif','.png']:
        make_files(img_name + '\\' + str(random.randint(1, 99999999999999)) + listss, img_url)
    else:
        print(img_url)
例3:
#coding:utf-8
"""
功能:
    登录验证模块
详细说明:
    1.密码文件为passwd
    2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!!
    3.未注册用户登录会提示:用户名不存在,请您先进行注册!
    4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录
    5.作为装饰器进行登录验证
"""
import json
import hashlib
import os
pwd = os.getcwd()
fileName = os.path.join(pwd,"passwd")

#将明文密码通过md5进行加密,返回一个加密后的md5的值
def calc_md5(passwd):
    md5 = hashlib.md5("abcdefg")
    md5.update(passwd)
    ret = md5.hexdigest()
    return ret


#新用户注册模块
def register():
    #判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典
    if os.path.exists(fileName):
        #载入用户列表,数据结构为字典,k=userName,v=passwdMd5
        with open("passwd", "r+") as loadsFn:
            userDB = json.loads(loadsFn.read())
    else:
        userDB = {}
    #让用户输入用户名
    userName = raw_input("姓名:")
    #标志位:控制循环跳出
    flag = True
    while flag:
        #用户注册时,需输入两次密码
        passwd1 = raw_input("密码:")
        passwd2 = raw_input("确认密码:")
        #如果两次密码不一致,则不执行下一步,再次输入密码并进行确认
        if not passwd1 == passwd2:
            continue
        else:
            #两次输入密码一致,标志位置为False,下次跳出循环
            flag = False
        #调用calc_md5函数将明文密码转为对应的md5值,用于保存
        passwdMd5 = calc_md5(passwd1)
    #将用户名与密码对应存入字典userDB中
    userDB[userName] = passwdMd5
    #将用户名和密码存入文件
    with open(fileName, "w") as dumpFn:
        dumpFn.write(json.dumps(userDB))


#用户登录验证,装饰器
def login(func):
    def decorater(*args,**kwargs):
        #判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回
        if os.path.exists(fileName):
            with open("passwd", "r+") as loadsFn:
                userDB = json.loads(loadsFn.read())
        else:
            print "密码文件不存在,建议重新注册!!"
            register()
            return

        name = raw_input("用户名:")
        #用户名是否存在,存在就继续输入密码,不存在则进行注册
        if name in userDB.keys():
            flag = True
            counter = 0
            #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证
            while flag:
                passwd = raw_input("密码:")
                passwdMd5 = calc_md5(passwd)
                if passwdMd5 == userDB[name]:
                    flag = False
                    func(*args,**kwargs)
                elif counter > 2:
                    print "您已经尝试了3次,请过会儿再试!!"
                    return
                else:
                    counter += 1
        else:
            print "用户名不存在,请您先进行注册!"
            register()
    return decorater

if __name__ == "__main__":
    @login
    def hello():
        print "Hello world!"
    hello()

猜你喜欢

转载自www.cnblogs.com/QiKa/p/12942409.html