Python如何接入開放平臺(tái)?簽名驗(yàn)簽、加密解密、授權(quán)認(rèn)證測(cè)試實(shí)戰(zhàn)
當(dāng)前大型top企業(yè)都有非常成熟的開放平臺(tái)業(yè)務(wù),比如微信開放平臺(tái)、新浪微博開放平臺(tái)、支付寶開放平臺(tái)等。開放平臺(tái)的發(fā)展為第三方個(gè)人或企業(yè)提供了巨大的機(jī)遇。開發(fā)者想要接入各大開放平臺(tái),必須要遵從開放平臺(tái)的安全機(jī)制,實(shí)現(xiàn)業(yè)務(wù)邏輯的前提,首先就是要實(shí)現(xiàn)簽名驗(yàn)簽、加密解密以及授權(quán)認(rèn)證機(jī)制。
本文介紹基于python的開放平臺(tái)簽名、認(rèn)證測(cè)試體系,可以用于第三方應(yīng)用的沙盒測(cè)試,同時(shí)可以應(yīng)用于服務(wù)提供方相關(guān)系統(tǒng)的全面測(cè)試。
一、引言
開放平臺(tái)是指大型企業(yè)將自身的數(shù)據(jù)能力、計(jì)算能力、用戶體系、產(chǎn)品能力等資源以業(yè)務(wù)+場(chǎng)景+解決方案+技術(shù)的優(yōu)勢(shì)包裝出來,通過openAPI、openSDK、openH5等形式開放給第三方個(gè)人或企業(yè)使用,實(shí)現(xiàn)第三方和服務(wù)提供方企業(yè)自身的互利共贏。
當(dāng)前各大廠的開放平臺(tái)都已經(jīng)比較成熟,比如說微信開放平臺(tái)、新浪微博開放平臺(tái)、支付寶開放平臺(tái)等。同時(shí),各大商業(yè)銀行也在大力發(fā)展自身的開放銀行業(yè)務(wù)。作為第三方開發(fā)者,通常來說接入開放平臺(tái)有比較統(tǒng)一的流程,下圖給出了微信開放平臺(tái)的開通流程。
圖1 微信開放平臺(tái)接入流程
如圖1第三步所示,在申請(qǐng)的應(yīng)用上線前,必須要進(jìn)行必要的測(cè)試,而進(jìn)行業(yè)務(wù)邏輯測(cè)試的前提就是進(jìn)行簽名驗(yàn)簽、加密解密以及授權(quán)認(rèn)證等安全認(rèn)證機(jī)制的測(cè)試。python社區(qū)非常成熟,廣泛應(yīng)用于機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、網(wǎng)絡(luò)爬蟲、自動(dòng)化腳本等諸多領(lǐng)域。
在web開發(fā)中當(dāng)前也有很多公司諸如Instagram, Quora, Lyft, Dropbox、知乎等后端都采用python開發(fā)。本文介紹基于python的簽名驗(yàn)簽、加密解密以及授權(quán)認(rèn)證測(cè)試的實(shí)現(xiàn)。
二、簽名驗(yàn)簽
第三方個(gè)人或企業(yè)通過開放平臺(tái)門戶網(wǎng)站提交成為開發(fā)者的申請(qǐng),開發(fā)者資質(zhì)認(rèn)證通過后,開發(fā)者通常會(huì)從服務(wù)提供方獲得自身的appid、appsecret以及證書,其中證書中包含第三方開發(fā)者的私鑰以及服務(wù)提供方的公鑰。
服務(wù)提供方保留第三方開發(fā)者的公鑰以及自身的私鑰。開發(fā)者通過自身的私鑰進(jìn)行簽名,發(fā)送報(bào)文到開放平臺(tái)服務(wù)器,服務(wù)器驗(yàn)簽通過后會(huì)用自身的私鑰對(duì)返回給開發(fā)者的報(bào)文進(jìn)行簽名,開發(fā)者接收到返回報(bào)文后利用服務(wù)方提供的公鑰進(jìn)行驗(yàn)簽。通過這個(gè)過程開發(fā)者和服務(wù)方就可以相互確認(rèn)發(fā)送的報(bào)文沒有被中間人篡改。
本文中簽名驗(yàn)簽用RSA算法進(jìn)行演示,使用到了python的Crypto庫(kù),需使用pip或conda等其他包管理工具進(jìn)行安裝。
一般情況下開發(fā)者需要對(duì)報(bào)文各個(gè)字段進(jìn)行預(yù)處理。
- 將請(qǐng)求字典中的空值,或者沒必要的參數(shù)都去掉(如sign、sign_type等);
- 對(duì)字典進(jìn)行排序(按ASCII碼從小到大);
- 把字典中的所有元素,按照"參數(shù)=參數(shù)值"的模式用"&"字符拼接成字符串。
數(shù)據(jù)預(yù)處理見下圖的函數(shù):
圖2 數(shù)據(jù)預(yù)處理函數(shù)
開發(fā)者發(fā)送報(bào)文時(shí),用一個(gè)Hash函數(shù)對(duì)報(bào)文中生成摘要,然后用私玥對(duì)摘要進(jìn)行加密,最后加密后的摘要作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給服務(wù)方。下圖展示了RSA算法的簽名函數(shù)實(shí)現(xiàn):
圖3 數(shù)字簽名函數(shù)
首先用hash_method函數(shù)選擇采用的摘要算法,可以根據(jù)實(shí)際情況進(jìn)行函數(shù)的重構(gòu),這里演示了MD5和SHA256算法的示例。簽名函數(shù)首先要讀入開發(fā)者私鑰,然后用RSA算法完成簽名。
開發(fā)者收到服務(wù)方返回的報(bào)文后,用與一樣的Hash函數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文的摘要,接著再用發(fā)送方的公鑰對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,如果這兩段摘要一致,則開發(fā)者就可以確認(rèn)該報(bào)文是服務(wù)方發(fā)送的,且沒有被篡改。
圖4 驗(yàn)簽函數(shù)
三、加密解密
RAS算法除了可用于數(shù)字簽名外,同樣可用來對(duì)報(bào)文進(jìn)行非對(duì)稱加密,非對(duì)稱加密安全性要比對(duì)稱加密高,但由于算法強(qiáng)度比對(duì)稱加密復(fù)雜,加解密的速度比對(duì)稱加解密慢。對(duì)稱加密算法的特點(diǎn)是計(jì)算量小、加密速度快、加密效率高。不足之處是,交易雙方都使用同樣密鑰,安全性得不到保證。常見的對(duì)稱加密算法有DES、AES 等。
在互聯(lián)網(wǎng)上傳輸消息即要保證信息的安全性,又要保證不能有高的延遲,所以通常會(huì)將對(duì)稱加密算法和非對(duì)稱加密算法聯(lián)合使用。使用非對(duì)稱加密算法進(jìn)行數(shù)字簽名以及將對(duì)稱加密算法所用密鑰的加密傳輸,然后再使用對(duì)稱加密算法對(duì)報(bào)文進(jìn)行加解密,即保證了報(bào)文傳輸?shù)陌踩?,又保證了報(bào)文傳輸?shù)乃俣?,提升了用戶體驗(yàn)。
下面介紹python實(shí)現(xiàn)AES加解密的方案,其他加密算法也是類似的方法,可以根據(jù)服務(wù)方的要求選擇采用哪種算法。AES加密方式有五種:ECB, CBC, CTR, CFB, OFB。最常用的是CBC加密方式。CBC加密需要一個(gè)十六位的key和一個(gè)十六位偏移量。開發(fā)者使用服務(wù)方提供的appsecret作為key來進(jìn)行加解密,具體實(shí)現(xiàn)如下圖所示:
圖5 AES加解密
加密后的數(shù)據(jù)要和簽名一同發(fā)送到服務(wù)方,通常情況下報(bào)文是否采用對(duì)稱加密是可選的,開發(fā)者可以 根據(jù)開放平臺(tái)的規(guī)定以及交易的重要程度選擇是否加密。
四、授權(quán)認(rèn)證
各大開放平臺(tái)都有自身的授權(quán)認(rèn)證機(jī)制,目前最流行的機(jī)制就是OAuth2.0。OAuth2.0 是一個(gè)開放授權(quán)標(biāo)準(zhǔn),它允許用戶授權(quán)第三方應(yīng)用訪問該用戶在某服務(wù)(比如微博、微信、qq等)上的特定私有資源,而不需要提供賬號(hào)密碼給第三方應(yīng)用,也不需要注冊(cè)第三方應(yīng)用的賬戶。想要進(jìn)行開放平臺(tái)授權(quán)認(rèn)證測(cè)試,就必須要根據(jù)OAuth2.0標(biāo)準(zhǔn)與服務(wù)方進(jìn)行對(duì)接。在一般情況下,服務(wù)方提供授權(quán)服務(wù),主要提供兩類接口:
(1) 授權(quán)接口:接受第三方應(yīng)用的授權(quán)請(qǐng)求,該接口通常包含以下參數(shù):
- response_type:必選。值固定為"code"。
- client_id:必選。第三方應(yīng)用的標(biāo)識(shí)ID,也就是appID。
- state:可選。第三方提供的一個(gè)字符串,服務(wù)器會(huì)原樣返回。
- redirect_uri:必選。授權(quán)成功后的重定向地址。
- scope:可選。表示想要訪問的資源的授權(quán)范圍。
接口訪問成功后會(huì)得到授權(quán)碼。
(2) 獲取訪問令牌(token)接口:使用授權(quán)接口提供的授權(quán)碼來頒發(fā)訪問令牌給第三方應(yīng)用。通常包含以下參數(shù):
- grant_type:必選。固定值"authorization_code"。
- code : 必選。授權(quán)接口中響應(yīng)的授權(quán)碼。
- redirect_uri:必選。必須和授權(quán)接口中提供的redirect_uri相同。
- client_id:必選。必須和授權(quán)接口中提供的appID相同。
第三方應(yīng)用拿到token后就可以用token去請(qǐng)求用戶授權(quán)其訪問的保存在服務(wù)方的資源。
上述接口的請(qǐng)求可以自己編碼實(shí)現(xiàn)。python的django-allauth庫(kù)已經(jīng)封裝了包括GitHub、Twitter、微博、微信、百度等幾十種第三方授權(quán)認(rèn)證方式。通過簡(jiǎn)單的配置就可以應(yīng)對(duì)各大廠開放平臺(tái)的授權(quán)認(rèn)證測(cè)試。下圖展示了如何在django應(yīng)用中注冊(cè)django-allauth第三方登陸服務(wù)。
圖6 使用django-allauth庫(kù)完成第三方授權(quán)登陸
五、總結(jié)
本文介紹了使用python接入各大開放平臺(tái),實(shí)現(xiàn)簽名驗(yàn)簽、加密解密以及授權(quán)認(rèn)證的測(cè)試方法,給出了詳細(xì)的示例。開發(fā)者可以通過將上述的方法封裝成django或者其他框架的web應(yīng)用,形成易于測(cè)試人員操作的界面,在處理簽名驗(yàn)簽、加密解密、授權(quán)認(rèn)證等測(cè)試或開發(fā)工作時(shí),可以極大地極大的提升工作效率。