目前各大top公司都有非常成熟的开放平台服务,如微信开放平台、新浪微博开放平台、支付宝开放平台等。平台为第三方个人或企业提供了巨大的机会。想要接入各大开放平台的开发者,必须遵守开放平台的安全机制。实现业务逻辑的前提是实现签名校验、加解密、授权认证机制。本文介绍基于python的开放平台签名认证测试系统,可用于第三方应用的沙盒测试和服务商相关系统的综合测试。1.简介开放平台是指大型企业利用业务+场景+解决方案+技术的优势,将自身的数据能力、计算能力、用户体系、产品能力等资源进行打包,通过openAPI向第三方开放,openSDK、openH5等第三方个人或公司使用,实现第三方与服务商公司自身的互利共赢。目前各大厂商的开放平台都比较成熟,如微信开放平台、新浪微博开放平台、支付宝开放平台等。与此同时,各大商业银行也在大力发展自己的开放银行业务。作为第三方开发者,一般来说接入开放平台都有一个比较统一的流程。下图为微信开放平台的开通流程。图1微信开放平台的接入流程如图1中第三步所示,申请的应用上线前,必须进行必要的测试,业务逻辑测试的前提是进行签名校验、加解密,和授权认证。安全认证机制的测试。python社区非常成熟,广泛应用于机器学习、数据分析、网络爬虫、自动化脚本等诸多领域。在web开发方面,目前有很多公司如Instagram、Quora、Lyft、Dropbox、知乎等后台使用python进行开发。本文介绍基于python的签名校验、加解密、授权认证测试的实现。2.签名验证第三方个人或企业通过开放平台门户提交成为开发者的申请。开发者资质认证通过后,开发者通常会从服务商处获得自己的appid、appsecret、证书。证书中包含第三方开发者的私钥和服务商的公钥。服务商保管着第三方开发者的公钥和自己的私钥。开发者使用自己的私钥进行签名,并将消息发送到开放平台服务器。服务器通过签名验证后,会使用自己的私钥对返回给开发者的消息进行签名。开发者收到返回的消息后,使用服务方提供的公钥进行签名验证。通过这个过程,开发者和服务端可以相互确认发送的消息没有被中间人篡改过。本文演示了使用RSA算法进行签名验证,使用的是python的Crypto库,需要配合pip或conda等其他包管理工具安装。一般来说,开发者需要对消息的各个字段进行预处理。去除请求字典中的空值或不需要的参数(如sign、sign_type等);对字典进行排序(按照ASCII码从小到大);字典中的所有元素按照“parameter=parametervalue”排序模式用“&”字符拼接成一个字符串。数据预处理见下图中的函数:图2数据预处理函数的开发者在发送消息时,使用Hash函数在消息中生成摘要,然后用私钥对摘要进行加密,最后使用加密摘要作为消息数字签名与消息一起发送到服务器。下图是RSA算法的签名函数的实现:图3数字签名函数首先使用hash_method函数选择使用的摘要算法,函数可以根据实际情况重构。以下是MD5和SHA256算法的示例。签名功能首先要读入开发者的私钥,然后使用RSA算法完成签名。开发者收到服务器返回的消息后,使用相同的Hash函数从收到的原始消息中计算出消息的摘要,然后使用发送者的公钥解密消息所附的数字签名,如果两个摘要一致,开发??者可以确认消息是服务端发送的,没有被篡改。图4签名验证函数3.加密与解密RAS算法不仅可以用于数字签名,还可以用于消息的非对称加密。非对称加密比对称加密更安全,但由于算法强度比对称加密复杂,所以加密和解密比对称加密和解密慢。对称加密算法具有计算量小、加密速度快、加密效率高的特点。缺点是交易双方使用同一个密钥,安全性得不到保证。常见的对称加密算法有DES、AES等。要在互联网上传输信息,既要保证信息的安全,又要保证不存在高延迟,所以通常采用对称加密算法和非对称加密算法组合使用。使用非对称加密算法进行数字签名并加密传输对称加密算法使用的密钥,再使用对称加密算法对报文进行加解密,既保证了报文传输的安全性,又保证了报文传输的安全性.速度,提升用户体验。下面介绍python实现AES加解密的方法。其他加密算法也类似。您可以根据服务器的要求选择使用哪种算法。AES加密方式有五种:ECB、CBC、CTR、CFB、OFB。最常用的是CBC加密方法。CBC加密需要一个十六位密钥和一个十六位偏移量。开发者使用服务器提供的appsecret作为密钥进行加解密。具体实现如下图所示:图5AES加解密加密后的数据必须连同签名一起发送给服务器。通常,消息是否使用对称加密是一个选择问题。可选的,开发者可以根据开放平台的规定和交易的重要性选择是否加密。4.授权认证各大开放平台都有自己的授权认证机制,目前最流行的机制是OAuth2.0。OAuth2.0是一种开放的授权标准,允许用户授权第三方应用访问用户在某个服务上的特定私有资源(如微博、微信、QQ等)第三方应用无需注册账号.如果要进行开放平台授权认证测试,必须按照OAuth2.0标准对接服务商。一般来说,服务提供者提供授权服务,主要提供两类接口:(1)授权接口:接受来自第三方应用的授权请求。该接口通常包含以下参数:response_type:required。该值固定为“代码”。client_id:必需。第三方应用的标识ID,即appID。状态:可选。第三方提供的字符串,服务器原样返回。redirect_uri:必需。成功授权后重定向URL。范围:可选。表示您要访问的资源的授权范围。接口访问成功后,会得到一个授权码。(2)获取访问令牌(token)接口:使用授权接口提供的授权码向第三方应用颁发访问令牌。通常包含以下参数:grant_type:必需。固定值“authorization_code”。代码:必填。授权接口中响应的授权码。redirect_uri:必需。必须与授权接口中提供的redirect_uri一致。client_id:必需。必须与授权接口提供的appID一致。第三方应用程序拿到token后,就可以使用token请求用户授权访问服务器上存储的资源。以上接口的请求可以自己编码实现。Python的django-allauth库封装了包括GitHub、Twitter、微博、微信、百度等数十种第三方认证方式,通过简单的配置即可应对各大厂商开放平台的授权认证测试。下图展示了如何在django应用中注册django-allauth第三方登录服务。图6使用django-allauth库完成第三方授权登录五、总结本文介绍了使用python访问各大开放平台实现签名校验、加解密、授权认证的测试方法,并给出了详细的示例.开发者可以将上述方法封装到django或者其他框架的web应用中,形成一个便于测试人员操作的界面。在处理签名验证、加解密、授权认证等测试或开发工作时,可以大大提高工作效率。
