• 接口测试中验签与接口参数加密


    验签:

      背景:

        在实际工作中,有些敏感接口如支付接口,接口定义了一个入参为auth,在请求接口时,必须传入正确的auth,接口才会返回正确的数据,否则不处理,目的是为了加强接口的安全性

      原理:

        每次发送请求时都需要携带一个参数,可能是header里面传,也可能是在body里面,一般定义名为auth

        根据提供的算法,生成一个签名,每次请求的时候带上这个签名,后端验证签名通过后,这个请求才会被处理,否则不处理这条请求

      例子:

      使用fastapi本地mock一个接口

    import fastapi
    import uvicorn
    import hashlib
    server = fastapi.FastAPI()
    
    salt = 'ssz-abc'
    
    @server.post('/api/test')
    def test(name:str,addr:str,phone:str,auth:str):
        s = '%s%s%s%s'%(name,addr,phone,salt)
        s = hashlib.md5(s.encode()).hexdigest()
        print(s)
        if auth == s:
            return {"code":0,"msg":"操作成功","name":name,"addr":addr,"phone":phone,"auth":auth}
        else:
            return {"code":-1,"msg":"验签失败"}
    
    
    if __name__ == '__main__':
        uvicorn.run('验签:server',port=9000,host='0.0.0.0',debug=True)

      当使用postman请求时,如果auth与算法生成的结果不一致,则不会处理这条请求

    加密:

      背景:实际工作中,有些接口不希望被其他人读懂入参和出参报文,经常会将参数使用加密后的数据来传递入参,比如常用的AES加密,加密和解密使用不同的密钥

      原理:每次请求传过来的都是一个加密字符串,1.先知道加密的算法是什么  2.每次发请求之前,都把参数加密

    #pip install pycrypto
    
    from Crypto.Cipher import AES
    from binascii import b2a_hex, a2b_hex
    import fastapi
    
    server = fastapi.FASTAPI()
     
    class Prpcrypt():
        def __init__(self, key):
            '''
            :param key:security_key,一个16位的随机字符串,不要让别人知道
            '''
            self.key = key.encode()
     
        # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
        def encrypt(self, text):
            text = text.encode()
            cryptor = AES.new(self.key, AES.MODE_CBC, self.key)  # 生成一个加密对象
     
            # 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用
            length = 16
            count = len(text)
            if count % length != 0:  # 判断加密的字符串长度是不是16的倍数
                add = length - (count % length)  # 如果不是的话,就在前面补多少个/0, 这里的算法是
                # 举例:53/16 商3 余5; 16-5 = 11, 53+11 = 64 ;,64是53上面最小的一个16的倍数
                # 53是加密内容的长度,不是16的倍数,通过 16 - (53 % 16 ) 算出需要补多少个/0,加密内容的长度才是16的倍数
            else:
                add = 0
            text = text + (b'' * add)
            ciphertext = cryptor.encrypt(text)
            # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
            # 所以这里统一把加密后的字符串转化为16进制字符串,就是b9925b80185497ccbcc3d501604845ee这样的密文
            # b2a_hex这个函数的作用就是把bytes类型的转成16进制
            result = b2a_hex(ciphertext).decode()
            return result
     
        def decrypt(self, text):
            cryptor = AES.new(self.key, AES.MODE_CBC, self.key)  # 生成一个加密对象
            plain_text = cryptor.decrypt(a2b_hex(text))  # a2b_hex就是把16进制的转成bytes类型的
            return plain_text.decode()
    
    @server.get('/api/test1')
        def test1('/api/test1'):
            p = Prpcrypt('1234567890123456')
            miwen = p.encrypt('{"code":1}')
            result = p.decrypt(miwen)
            return {"code":0,"msg":result}

      

  • 相关阅读:
    算法的定义
    用标准的CSS定义你的表格样式
    Mysql存储过程中临时表的建立及游标遍历
    Ubuntu10.0下编译qt版webkit
    指针函数的一个范例,在单片机上运用它能让您的程序结构更明朗清晰,层次感强
    你若不自己爬上来,我就把你打死在水中——分享三个跟管理有关的小故事
    Windows 上使用 Github 手记
    IIS应用程序池由服务器引起常见错误号的原因分析及解决方法
    如何实施好基于MOSS的企业搜索项目(上)
    如何做好项目经理
  • 原文地址:https://www.cnblogs.com/bugoobird/p/13212496.html
Copyright © 2020-2023  润新知