python关于接口的签名和验签的简单示例

为什么要签名?
1、防止接口被恶意调用,增加服务器的压力
2、保证数据的一致性(即发送和收的的数据相同)
签名校验原理?
1、简单点的理解就是客户端发送{"username":"jack","password":"aaa123456"}给服务端,通过一个key="hello world"加入到你的请求体里面,然后通过一系列方式得到一个sign,你的发送数据变成{"username":"jack","password":"aaa123456","sign":"DKAG663F"}
2、服务端得到数据之后,去除sign字段,得到客户端需要发送的真实请求数据,然后用相同的key="hello world",用相同的手段对其进行加密,同样得到一个new_sign,如果sign==new_sign,那证明是自己人请求的,数据也没用被修改,因为key只有我俩自己知道,否则就是他人请求的,给与拒绝

搞清楚为什么要进行签名和签名的基本原理了,现在实现一个简单的签名已经验签,直接上代码,本文是以MD5的方式进行加密,其他的方式基本原理也一样

a、新建一个目录sign_test,目录下我建了三个python文件,get_sign.py,requests_server.py,requests_client.py
b、get_sign.py

import hashlib  # 导入模块hashlib
# md5加密算法
def MD5(str):
    '''
    :param str: 需要加密的字符串
    :return: 加密完成的密文
    '''
    md = hashlib.md5()  # 创建md5对象
    md.update(str.encode(encoding='utf-8'))
    return md.hexdigest()
# 获取sign签名
def getSign(map: dict, key: str):
    '''
    :param map: 接口的请求数据
    :param key: 客户端与服务端约定的key
    :return: 签名
    '''
    # 遍历字典,组成特定格式(k1=v1&)字符串的列表
    li = [(k, map[k]) for k in sorted(map.keys())]
    result = ""
    for i in li:
        result += i[0] + "=" + i[1] + "&"
    # print(result) result=password=aaa123456&username=jack&
    result_new = result + 'key=' + key
    # print(result_new)result_new=password=aaa123456&username=jack&key=hello
    # md5加密,并转为大写。
    sign = MD5(result_new).upper()
    # 返回sign
    return sign #95E34CB05C944D33DE166E03942C83B3
if __name__ == '__main__':
    body={"username":"jack","password":"aaa123456"}
    key="hello"
    sign=get_sign(body,key)
    print(sign)

c、requests_server.py,启动一个服务端进行验签

from flask import Flask, request
import json
from flask_cors import CORS
from sign_test.get_sign import get_sign

app = Flask(__name__)
# 允许跨域
CORS(app, resources=r'*')

@app.route('/api', methods=['POST'])
def api():
    data = json.loads(request.data)
    print("请求体的数据:{}".format(data))
    sign = data["sign"]
    del data["sign"]
    # 将请求的数据去除sign之后,用相同的key去加密,得到一个new_sign
    new_sign = get_sign(data, key="hello")
    print("服务端的签名:{}".format(new_sign))
    # 判断客户端发过来的签名是否与服务端的签名一致
    if sign == new_sign:
        '''do something
            、、、
            、、、
        '''
        res = {"status": 200, }
        return json.dumps(res)
    else:
        return json.dumps({"status": 500})
if __name__ == '__main__':
    app.run(host='localhost', port=8009, debug=True)

d、requests_client.py

from sign_test.get_sign import get_sign
import requests, json
# 主程序
if __name__ == "__main__":
    # 加密秘钥
    key = "hello"#key是双方约定的,我这边就是直接写死一个,与服务端一直
    body = {"username": "alex", "pwd": "123456"}
    sign = get_sign(body, key)
    body["sign"] = sign
    url="http://localhost:8009/api"
    res = requests.post(url=url, data=json.dumps(body))
    print("请求体body={}".format(body))
    print("返回值:{}".format(json.loads(res.content)))

e、保持key="hello",启动服务,发送请求
客户端

请求体body={'username': 'alex', 'pwd': '123456', 'sign':'E9C952A9F32719995319149991365D15'}
返回值:{'status': 200}

服务端

请求体的数据:{'username': 'alex', 'pwd': '123456', 'sign': 'E9C952A9F32719995319149991365D15'}
服务端的签名:E9C952A9F32719995319149991365D15

签名和验签都是成功的!!!!!!!!!!!!!

f、保持服务端key="hello",客户端key=world启动服务,发送请求
客户端

请求体body={'username': 'alex', 'pwd': '123456', 'sign': 'DFB02DEE70B5B9D3CD8B446051EF3A84'}
返回值:{'status': 500}

服务端

请求体的数据:{'username': 'alex', 'pwd': '123456', 'sign': 'DFB02DEE70B5B9D3CD8B446051EF3A84'}
服务端的签名:E9C952A9F32719995319149991365D15

客户端返回的是500,验签是失败的,因key不一致!!!!

本文采用的是MD5进行的加密,由于MD5加密是不可逆的,所以一般可以用来签名或者校验文件的完整性,原理都是一样的,现在签名和加密用的较多的就是RSA和AES算法,基本上用法都差不多,文中有错误的欢迎指出,有兴趣测试或者开发伙伴欢迎来一起探讨

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容