如何設計B端SDK和API的激活與安全機制?
在C端流量紅利逐漸消失的今天,很多企業開始轉向 to B的生意。
而B端的生意就離不開SDK和API。這是公司對外輸出技術方案必不可少的兩種不同的形式。
因此,本文將結合SDK和API進行介紹,分析它們的區別以及如何設置激活與安全機制。
1. SDK和API的區別
首先我們簡單來講一下SDK和API的區別。
1.1 什么是API?
API,全稱Application Programming Interface,即應用程序編程接口。
API其實就是把做好的功能,封裝成各種預先定義好的函數,其他人想使用這些已有的功能,只需要調用這些函數,并傳遞必要的參數即可。
API的主要作用是,程序員不需要深究API背后功能實現的具體邏輯,程序員只需要直接調用API就可以使用其背后的功能邏輯,這節省了程序員一大部分的工作,大大提升了效率。
舉個例子:
銀行的窗口就類似一個個的API,他們分別有不同的功能,比如取款、存款、對公等業務。
而我們預先填好的表格信息,交給窗口的工作人員,就是傳遞必要的“參數”信息給這個窗口API,然后使用它的存款功能。
我們不需要理解工作人員具體需要哪些操作,其中涉及多少復雜邏輯。
只需要來到窗口(調用API),上交表格(傳遞必要信息)就能使用該功能服務。
1.2 什么是SDK?
SDK 就是 Software Development Kit 的縮寫,翻譯過來——軟件開發工具包。
這是一個覆蓋面相當廣泛的名詞,可以這么說:輔助開發某一類軟件的相關文檔、范例和工具的集合都可以叫做SDK。
SDK可以簡單的認為是一系列API的程序包集合。在這個程序包中是一個完整的軟件功能,這份程序包幾乎是全封閉的,只有一個小小接口(API)可以聯通外界。
還是剛剛銀行的例子:
可以把銀行看做是一整個SDK,銀行SDK程序包能幫你完成存款、取款等業務。
銀行SDK唯一聯通外界的就是它的大門,或者說是取號機(API),只有進入銀行然后取號,才能在不同的窗口辦理服務。
而這些不同的窗口,就可以看成一個個不同功能的API接口。
2. API的接入安全機制
安全機制,其實是為了保護我方后臺,主要有兩點:
- 不被不明身份者訪問
- 不被惡意大量的請求攻擊
先來簡單說一下API的接入安全機制。
API的安全機制設計主要考慮兩個方面:
- API接入方案如何避免接口盜用(防止不明身份者訪問)
- Http接口請求如何避免攻擊(防止被惡意大量請求攻擊)
第一個方面,需要客戶對自家的后臺做一層封裝,然后我們后臺僅接受客戶后臺接口傳遞的請求。
第二個方面,需要在我方后臺建立IP白名單,提供給客戶后臺,方便雙方進行加密驗證。識別哪些是客戶的請求,哪些是惡意請求。
3. SDK的接入安全機制
為了防止客戶拿到我們的SDK以后白嫖,或者為所欲為,我們需要在客戶接入SDK,請求我方服務的時候進行激活校驗。
就像是我們買票進站乘車一樣,需要出示身份證和車票進行校驗方可通過。
SDK最終都是會被集成到硬件設備中提供服務,尤其是AI公司的技術方案,不管是視覺還是語音,最后交付的都是硬件產品。
通常激活的時機,都是在硬件設備進行第一次啟動的時候進行。
SDK的激活涉及到我方對客戶的計費,所以激活邏輯的設計要非常的仔細和嚴謹(畢竟都是錢哪。。)
一般來說,SDK的激活方案可以分為三種(以下說法參考思必馳的產品授權方案):
- 預燒錄
- 預登記
- 動態注冊
預燒錄,指的是,我們后臺預先生成授權的license文件,然后預先寫入硬件設備的存儲文件中。在設備首次啟動的時候,就直接調取license文件進行激活。這種方式適用于需要不聯網提供服務的場景。
預登記,指的是,預先登記設備白名單,以用戶設備注冊激活的一種授權方式。這種方式適用于客戶提前知道所需授權設備的設備標識的場景
動態注冊,指的是,每次設備激活,后臺動態給這些設備進行激活并注冊的一種形式。這種方式適用于客戶可以提供設備的唯一標識,但是提前不知道哪些設備需要授權,不知道有多少設備需要授權的場景。
下面想主要講一下,我在設計預登記和動態注冊時遇到的一些坑。
3.1 預登記對我方友好,但是對客戶不太靈活
預登記方式其實對我方來說是比較友好的,因為客戶提前提供準確的設備唯一標識的時候,我們可以很方面的進行激活和統計,說直白點,就是方便收錢。
所以,客戶為了省錢,有可能采取作弊策略:將一個設備的唯一標識給多臺設備進行使用。
因為設備標識,一般是設備序列號(SN),對于硬件廠商來說是可以自己按照一定的規則隨便刷的。
那為了防止被客戶白嫖,我們自然要設計一套防作弊策略:不僅僅采集客戶提供的設備序列號,還要采集一些設備的其他信息進行輔助判斷,該序列號只綁定了一臺設備。
當客戶想白嫖我們,將設備A的序列號給設備B使用,那么在激活校驗的時候,就會發現設備B的序列號關聯的信息和我們記錄的信息(設備A)不同,如此就可以認定客戶是想白嫖,激活失敗。
上述方式看起來比較完美的解決了客戶作弊的問題。但是對于部分客戶來說就會造成不便。
有些客戶在對接SDK后,會進行測試。在測試的過程中,客戶會不斷的對硬件設備進行刷機、恢復出廠設置等騷操作。
而刷機、恢復出廠設置會改變設備的信息(例如AndroidID),那么就會造成同樣的序列號在同一臺設備上不能激活了。
因為刷機改變了它的設備信息,我們會認為這不是同一臺設備。
你可能會說,那客戶再寫一個序列號不就行了,反正客戶可以自己刷序列號。
客戶是上帝,你不能指望客戶去干這樣的累活。當然是我們來優化了。
為了解決這個問題,我們想到一個方案:超級序列號。這個序列號必須是我們來生成(可控),擁有無限次激活,可以在多臺設備上使用的超能力。
但是為了防止客戶拿這個超級序列號白嫖我們,我們需要給這個超級序列號設置時間限制。在有效時間內可以隨意使用,一旦過了有效期就會失效。
3.2 動態注冊雖然靈活,但是對于統計來說麻煩
動態注冊就是在設備第一次啟動激活的時候,上傳設備的信息,包括:序列號、MAC(藍牙+WiFi)、IMEI和AndroidID。
但是這些信息不一定能獲取到。
IMEI,國際移動設備識別碼(International Mobile Equipment Identity,IMEI)
IMEI本該最理想的設備ID,具備唯一性,恢復出廠設置不會變化(真正的設備相關)。
但是Android6.0以后,就需要用戶授權才能使用,而且在Android10.0以后,就會徹底拒絕獲取IMEI。
并且,IMEI其實只有通訊的設備才會有,如果沒有通訊(簡單理解,就是電話卡)模塊的話,也不一定有IMEI號。
序列號(SN)
設備序列號由廠商提供,如果廠商比較規范的話,序列號應該是唯一的,也不會隨刷機或恢復出廠設置等改變。
但是你不能把利益建立在人性的基礎上,那太不靠譜。所以序列號,其實更多只能作為輔助信息來進行判斷。
MAC地址
MAC地址一般指藍牙MAC、WiFi Mac或者是兩者的拼接。但是獲取同樣需要權限,而且如果設備沒有藍牙模塊,沒有WiFi模塊的話,也不一定有MAC地址。
Android ID
Android ID 是獲取門檻最低的,不需要任何權限,64bit 的取值范圍,唯一性算是很好的了。但是不足之處也很明顯:刷機、root、恢復出廠設置等會使得 Android ID 改變
所以,我們在設計動態注冊激活邏輯的時候,就需要考慮到這些情況。
動態注冊的激活邏輯,就是每次激活的時候,后臺記錄設備上傳的四個設備信息(有的不一定有)。
然后每次其他設備激活的時候,就把該要激活的設備信息在已激活的設備信息記錄中進行比對,比對的規則有兩方面:
- 所上報的設備信息種類是否一致,種類指的是四種設備信息
- 所上報的設備信息是否一致
這樣的激活邏輯,雖然能保證最大程度的識別出不同的設備,但是會給統計激活設備上(統計是為了收錢)造成麻煩。
例如,AndroidID,會隨著刷機、恢復出廠設置而改變。這就會成為客戶扯皮的點。
客戶會說:“我并沒有更換設備,只是因為設備故障需要刷機或者恢復出廠設置,你就多收我一臺設備的錢,當我是冤大頭嗎?”
雖然這可以通過商務的手段去解決,但是還是那句話,客戶是霸霸嘛。
其實,從上面我們描述四大設備信息的特征來看,AndroidID具有如下優秀屬性:
- 一定能獲取到;
- 只有刷機操作才會改變,無法人為指定。
所以,完全可以以AndroidID作為主要依據,只要AndroidID一致,不管其他參數種類和參數值是否相同,都可以認為是一臺設備。
我們只需要找出那些,因為刷機或恢復出廠設置導致AndroidID改變的設備,而這些是客戶扯皮的主要部分。
因此,在我們給設備動態注冊的時候,要采用嚴格的規則,只要有一點不一樣,就重新注冊設備信息。
但是在統計激活的設備信息上,可以根據一定的規則,將具有爭議的注冊設備信息給統計出來,做到扯皮也是要有準備和技術含量的。
SDK 和 API 是公司輸出技術的主要手段,而如何設計激活邏輯和安全機制,是保證公司不被白嫖的手段,需要認真和謹慎的考慮。
以上內容是在工作中的一些總結,僅供大家參考。
本文由 @Jarvan 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
看到這篇文章真的是深有同感,其實就是考慮在線激活和離線激活且兩種形式并存,并且需要考慮客戶頻繁刷機導致的激活碼失效問題,補充一下,超級序列號的話可以寫個程序,監控同一個設備序列號激活的次數,如果發現這臺設備序列號在一天內或者幾天內激活了很多次,超過了設置的閾值,就可以視為異常,讓商務上門吧