溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-01-18 16:46:45 來(lái)源:億速云 閱讀:178 作者:柒染 欄目:安全技術(shù)

基于簽名算法且簡(jiǎn)單安全的API授權(quán)機(jī)制是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

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

去年筆者寫(xiě)過(guò)一個(gè)API統(tǒng)一授權(quán)平臺(tái),為內(nèi)部服務(wù)開(kāi)放接口給第三方系統(tǒng)調(diào)用提供統(tǒng)一的授權(quán)管理,除了方便管理接口授權(quán)外,沒(méi)有其它用途,但卻要花成本部署。這應(yīng)該是我做的一個(gè)最無(wú)意義的項(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)通過(guò)才放行請(qǐng)求。

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

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

授權(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)簽名過(guò)期。

接入方:

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

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

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

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

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

一是為簽名添加時(shí)效性。授權(quán)方系統(tǒng)可根據(jù)請(qǐng)求時(shí)間戳與系統(tǒng)當(dāng)前時(shí)間戳比較,限定簽名只能在一秒內(nèi)有效,或者五秒內(nèi)有效。但要求雙方系統(tǒng)時(shí)間必須正確。

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

即便你知道授權(quán)方(肉雞)系統(tǒng)的簽名規(guī)則,如果你不知道密鑰,也無(wú)法生成有效的簽名。并且由于簽名采用非對(duì)稱(chēng)加密算法,要想通過(guò)爆力破解出密鑰幾乎是不可能完成的事情。

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

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

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

簽名規(guī)則指的是生成加密之前的簽名字符串的規(guī)則,如規(guī)則:key+密鑰+時(shí)間戳+key+密鑰。假設(shè)key為“app”,密鑰為"123",時(shí)間戳為"1111111111111",拼接生成的加密前的簽名為"app1231111111111111app123",最后通過(guò)加密算法對(duì)拼接的字符串加密就能生成最終的簽名。

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

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

關(guān)于基于簽名算法且簡(jiǎn)單安全的API授權(quán)機(jī)制是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

api
AI