基于簽名算法且簡(jiǎn)單安全的API授權(quán)機(jī)制是什么

筆者以前在做廣告系統(tǒng)時(shí)發(fā)現(xiàn)對(duì)接的大多數(shù)平臺(tái)的廣告系統(tǒng)都是以Token方式授權(quán)接口,而且這個(gè)token是一直不變的,由廣告主提供,可以說這就是裸奔的接口,只不過這種接口對(duì)安全性要求不高,這只能防止惡意調(diào)用以及驗(yàn)證渠道的身份。

去年筆者寫過一個(gè)API統(tǒng)一授權(quán)平臺(tái),為內(nèi)部服務(wù)開放接口給第三方系統(tǒng)調(diào)用提供統(tǒng)一的授權(quán)管理,除了方便管理接口授權(quán)外,沒有其它用途,但卻要花成本部署。這應(yīng)該是我做的一個(gè)最無意義的項(xiàng)目了。

今天介紹的API授權(quán)機(jī)制或許也是使用較為廣泛的一種API接口授權(quán)機(jī)制,記得筆者以前做微信支付功能的時(shí)候,微信提供的支付接口也使用這種方式:簽名。優(yōu)勢(shì):簡(jiǎn)單、不影響性能、不需要額外成本。

這種授權(quán)方法的實(shí)現(xiàn)邏輯是,授權(quán)方為每個(gè)接入平臺(tái)設(shè)置唯一的身份標(biāo)識(shí)(key)以及設(shè)置獨(dú)立密鑰,其實(shí)也就相當(dāng)于賬號(hào)密碼。要求接入方系統(tǒng)在每次發(fā)起請(qǐng)求都在請(qǐng)求頭攜帶三個(gè)參數(shù),分別是身份標(biāo)識(shí)(key)、發(fā)起請(qǐng)求的時(shí)間戳、以及簽名,授權(quán)方系統(tǒng)在接收到請(qǐng)求時(shí)校驗(yàn)簽名,校驗(yàn)通過才放行請(qǐng)求。

校驗(yàn)簽名的過程為,從請(qǐng)求頭獲取key和時(shí)間戳,再根據(jù)密鑰通過相同算法生成簽名(調(diào)用方與授權(quán)方使用相同簽名算法),最后對(duì)比請(qǐng)求頭獲取的簽名是否相等,如果是則校驗(yàn)成功,否則校驗(yàn)失敗。

基于簽名算法的授權(quán)方法實(shí)現(xiàn)過程如下:

授權(quán)方:

1.定義簽名算法,提供簽名生成算法給接入方,并為接入方生成密鑰和身份標(biāo)識(shí);

2.在項(xiàng)目中攔截需要驗(yàn)證簽名的接口,從請(qǐng)求頭獲取時(shí)間戳和身份標(biāo)識(shí),根據(jù)密鑰和簽名算法生成簽名,將生成的簽名與從請(qǐng)求頭獲取到的簽名比較,如果相同則繼續(xù)步驟3,否則拒絕請(qǐng)求;

3.請(qǐng)求時(shí)效性校驗(yàn),用當(dāng)前系統(tǒng)時(shí)間戳與從請(qǐng)求頭獲取到的時(shí)間戳比較,如果請(qǐng)求在有效時(shí)間范圍內(nèi)則放行請(qǐng)求,否則拒絕并響應(yīng)簽名過期。

接入方:

1.從授權(quán)方獲取對(duì)接文檔,并向授權(quán)方要密鑰和身份標(biāo)識(shí);

2.根據(jù)文檔提供的簽名生成算法封裝簽名方法;

3.在發(fā)起請(qǐng)求時(shí),將身份標(biāo)識(shí)、當(dāng)前時(shí)間戳、簽名寫入請(qǐng)求頭。

簽名生成算法可自定義,如將身份標(biāo)識(shí)(key)、時(shí)間戳(timestamp)和密鑰拼接在一起后,再采用一種不可逆算法對(duì)字符串進(jìn)行加密生成簽名,如MD5算法。規(guī)則越復(fù)雜就越不容易被破解。

簽名加上時(shí)間戳有什么好處?

一是為簽名添加時(shí)效性。授權(quán)系統(tǒng)可以限制簽名的有效時(shí)間為一秒或五秒,利用請(qǐng)求時(shí)間戳和當(dāng)前時(shí)間戳進(jìn)行比較。但要求雙方系統(tǒng)時(shí)間必須正確。

二是安全性,如果黑客攔截了你們系統(tǒng)的請(qǐng)求,然后修改請(qǐng)求再發(fā)起請(qǐng)求,這期間肯定是要時(shí)間的吧,所以當(dāng)系統(tǒng)接收到篡改后的請(qǐng)求時(shí),簽名的有效期已經(jīng)過去了。如果更改請(qǐng)求頭傳遞的時(shí)間戳,請(qǐng)求的授權(quán)方系統(tǒng)將生成不同于請(qǐng)求頭傳遞的簽名,因此請(qǐng)求仍將無效。

如果你不知道密鑰,在了解授權(quán)方(肉雞)的簽名規(guī)則的前提下,也無法生成有效的簽名。使用非對(duì)稱加密算法簽名的文件,幾乎不可能通過暴力破解破解密鑰。

那為什么用時(shí)間戳而不用格式化時(shí)間字符串呢?

這可能是考慮時(shí)區(qū)上的兼容吧,不同機(jī)房所在時(shí)區(qū)不同的話,時(shí)間就不同,但時(shí)間戳都相同。

為發(fā)揮這種授權(quán)方式的安全性,首先是生成簽名的規(guī)則必須夠復(fù)雜,然后是簽名的加密算法要不可逆,千萬(wàn)不要使用Base64這種算法,最后是密鑰要足夠長(zhǎng)足夠復(fù)雜,以確保即便在知道簽名生成規(guī)則的情況下,也不可能通過暴力破解出密鑰。

簽名規(guī)則是指生成加密前的簽名字符串的規(guī)則,例如:規(guī)則包括key、密鑰、時(shí)間戳,其中key和密鑰會(huì)出現(xiàn)兩次。假設(shè)key為“app”,密鑰為”123″,時(shí)間戳為”1111111111111″,拼接生成的加密前的簽名為”app1231111111111111app123″,最后通過加密算法對(duì)拼接的字符串加密就能生成最終的簽名。

每個(gè)接口都要寫一遍簽名邏輯不麻煩嗎?

不需要。對(duì)于授權(quán)方,可通過過濾器或者攔截器完成簽名驗(yàn)證邏輯;對(duì)于調(diào)用方,使用不同框架有不同的方法,但我們總能想到辦法只寫一次簽名邏輯不是嗎?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享