api的验证与数据加密

api验证

客户端
from Crypto.Cipher import AES
from lib.conf.config import settings

def auth():
""" API验证 :return: """ import time import requests import hashlib ctime = time.time() key = settings.AUTH_KEY #这是在settings里的一个固定KEY值 new_key = "%s|%s" %(key,ctime,) m = hashlib.md5() m.update(bytes(new_key,encoding='utf-8')) #里面是字节数据 md5_key = m.hexdigest() #返回值是字符窜类型 md5_time_key = "%s|%s" %(md5_key,ctime) return md5_time_key
服务端,已做成装饰器
def api_auth(func):
""" 验证API :param func: :return: """ def inner(request,*args,**kwargs): client_md5_time_key = request.META.get("HTTP_OPENKEY") client_md5_key, client_ctime = client_md5_time_key.split("|") client_ctime = float(client_ctime) server_time = time.time() if server_time - client_ctime > 10: return HttpResponse("【第一关】小伙子,别唬我,时间太长了") temp = "%s|%s" % (settings.AUTH_KEY, client_ctime,) #这是settings的固定KEY值 m = hashlib.md5() m.update(bytes(temp, encoding='utf-8')) server_md5_key = m.hexdigest() if server_md5_key != client_md5_key: return HttpResponse('【第二关】小子,你是不是修改时间了') for k in list(api_key_record.keys()): v = api_key_record[k] if server_time > v: del api_key_record[k] if client_md5_time_key in api_key_record: return HttpResponse('【第三关】有人已经来过了...') else: api_key_record[client_md5_time_key] = client_ctime + 10 if server_md5_key != client_md5_key: return HttpResponse('认证失败...') return func(request,*args,**kwargs) return inner

 

数据加密

def encrypt(message):
    """
    数据加密
    :param message:
    :return:
    """
    key = settings.DATA_KEY
    cipher = AES.new(key, AES.MODE_CBC, key)
    ba_data = bytearray(message,encoding='utf-8')
    v1 = len(ba_data)
    v2 = v1 % 16
    if v2 == 0:
        v3 = 16
    else:
        v3 = 16 - v2
    for i in range(v3):
        ba_data.append(v3)
    final_data = ba_data.decode('utf-8')
    msg = cipher.encrypt(final_data) # 要加密的字符串,必须是16个字节或16个字节的倍数
    return msg


def decrypt(msg):
    """
    数据解密
    :param message:
    :return:
    """
    from Crypto.Cipher import AES
    key = settings.DATA_KEY
    cipher = AES.new(key, AES.MODE_CBC, key)
    result = cipher.decrypt(msg) # result = b'\xe8\xa6\x81\xe5\x8a\xa0\xe5\xaf\x86\xe5\x8a\xa0\xe5\xaf\x86\xe5\x8a\xa0sdfsd\t\t\t\t\t\t\t\t\t'
    data = result[0:-result[-1]]
    return str(data,encoding='utf-8')

 

posted on 2018-08-10 14:11  法海降妖  阅读(119)  评论(0编辑  收藏  举报