通過阿里云物聯(lián)網(wǎng)平臺使用AI算法保護
1. 簡介
AI算法保護,提供內(nèi)容的加密保護和全生命周期管理;授權(quán)過程的自動化和授權(quán)管理的統(tǒng)一化,防止內(nèi)容的拷貝和泄漏,以及提供商業(yè)售賣的靈活性、安全性和管理成本。
內(nèi)容加密保護,一次性加密,多種許可分發(fā)和管理,支持不同的授權(quán)管理策略,滿足不同場景的需求。
基于IoT安全自建的設(shè)備認(rèn)證產(chǎn)品(ID2),為內(nèi)容保護提供全鏈路的安全保護。
本文說明基于客戶物聯(lián)網(wǎng)平臺提供的消息傳輸通道,使用AI算法保護,進行內(nèi)容的加密保護和授權(quán)管理。
2. 角色劃分
接入AI算法保護會劃分為兩類角色,廠商需要根據(jù)不同的角色按步驟接入。
?
算法廠商:擁有AI算法的核心能力,在業(yè)務(wù)場景中會把算法授權(quán)到其它設(shè)備廠商使用。
設(shè)備廠商:擁有自己的IoT設(shè)備,計劃在IoT設(shè)備使用算法廠商所提供的算法。
3. 對接流程
3.1 整體接入流程
3.2 算法廠商接入
3.2.1 服務(wù)開通(線下)
通過IoT安全中心官網(wǎng)AI算法保護模塊,聯(lián)系我們進行線下開通。
3.2.2 模型加密(離線)
加密工具下載:服務(wù)開通后,通過點擊AI算法保護-算法模型-離線加密工具,下載加密工具到本地,對原始的模型進行處理。
模型加密工具:content_packager(Release Package/tools目錄),運行在Ubuntu的可執(zhí)行程序。
模型加密工具 - 選項說明:
參數(shù) (均為string類型) | 說明 | 附注 |
--help | 打印該使用說明 | |
--version | 打印內(nèi)容打包工具的版本 | |
--input | 待保護的文件 | 通過格式判定 |
--license | 支持2種情況:
|
|
--config | 保護配置文件(.json) | 用于配置模型文件的加密方式 |
--company | 公司名稱 | 長度在4~8之間 |
授權(quán)配置文件:
打開license配置文件模板license_config.json,配置如下參數(shù):
參數(shù) | 類型 | 說明 |
license_id | string |
|
extras | string | 用戶數(shù)據(jù),最長256 字節(jié),超過會截斷。 |
machine | string | 授權(quán)的設(shè)備id, 空則不綁定 |
valid_count | uint32 | 有效使用次數(shù)(-1 則無限制) |
valid_period_days | uint32 | 有效使用天數(shù)(-1 則無限制) |
?
保護配置文件:
打開保護配置文件模板protect_config.json,配置如下參數(shù):
參數(shù) | 類型 | 說明 |
enc_type | string | 加密保護的內(nèi)容類型:
|
enc_model | bool | true :打開分層加密 false:關(guān)閉分層加密(不改造算法模型) |
max_size | float | 最大加密的數(shù)據(jù)量(單位: MB):
|
sec_level | uint32 | 模型加密的安全強度(Security Level): 0 - 標(biāo)準(zhǔn)的AES加密 1 - 輕量的AES加密 |
模型加密工具 - 使用示例:
授權(quán)配置文件 - license_info.json,保護配置文件 - protect_config.json,模型文件 - googlenet.caffemodel:
./content_packager --input googlenet.caffemodel --license license_info.json --config protect_config.json --company alibaba |
輸出如下:
<PACK_TOOL> version: 1.2.0 <PACK_TOOL> folder ./LD-0100-alibaba-2944-20210104095107 is created <PACK_TOOL> License: ./LD-0100-alibaba-2944-20210104095107/LD-0100-alibaba-2944-20210104095107.lic <PACK_TOOL> Encrypted Content: ./LD-0100-alibaba-2944-20210104095107/googlenet.caffemodel.enc <PACK_TOOL> Content Packager Finished |
生成的加密文件為 <原始文件名稱>.enc,License文件為 <license id>.lic 存放在以licence id命名的文件夾中。
3.2.3 算法模型創(chuàng)建
如果算法廠商準(zhǔn)備授權(quán)一種新的算法到設(shè)備廠商,首先需要對模型進行離線加密處理,然后完成算法模型創(chuàng)建。
點擊新增算法模型按鈕,會彈出新增算法模型窗口。
輸入算法廠商名稱和算法模型名稱。
上傳授權(quán)許可文件,該文件由離線加密工具輸出<license_id>.lic。
點擊確認(rèn)按鈕完成算法模型新增。
3.2.4 設(shè)備廠商授權(quán)
?
算法廠商首先完成算法模型創(chuàng)建,然后通過此步驟把算法授權(quán)到設(shè)備廠商。完成該步驟后,設(shè)備廠商擁有使用該算法的權(quán)限,設(shè)備廠商可以按照設(shè)備廠商角色相關(guān)步驟進行后續(xù)的接入操作。
請點擊新增授權(quán)按鈕,彈出新增授權(quán)窗口。
輸入授權(quán)名稱、設(shè)備廠商阿里云賬號UID,所關(guān)聯(lián)的算法模型。(請確保輸入有效的設(shè)備廠商阿里云賬號UID)
指定產(chǎn)品使用的授權(quán)配額,允許設(shè)備廠商特定數(shù)量的IoT設(shè)備使用所關(guān)聯(lián)的算法模型。
指定AI算法授權(quán)到期時間。(當(dāng)AI算法到期后,IoT設(shè)備不能再使用所關(guān)聯(lián)的算法模型)
配置最大離線時間,(0~10000)小時,0表示允許永久離線。(當(dāng)離線間隔到期后,IoT設(shè)備需要聯(lián)網(wǎng)更新才能繼續(xù)使用)
點擊確認(rèn)按鈕完成授權(quán)新增。
3.2.5 查看使用記錄
請點擊AI算法保護-使用記錄,可查看設(shè)備廠商的IoT設(shè)備連接云端平臺獲取授權(quán)的使用記錄信息。
數(shù)據(jù)總覽界面。
已購買授權(quán):表示算法廠商購買的授權(quán)總額度。
已分配:表示算法廠商已經(jīng)分配到設(shè)備廠商的授權(quán)額度。
已使用:表示算法廠商所授權(quán)的設(shè)備廠商已使用的授權(quán)數(shù)量。
AI算法模型:表示算法廠商所創(chuàng)建的算法模型數(shù)量。
3.3 設(shè)備廠商接入
3.3.1 服務(wù)開通?
請聯(lián)系提供AI算法的算法廠商,并把自己阿里云賬號UID提供到算法廠商,由算法廠商為其進行授權(quán)。
當(dāng)算法廠商授權(quán)完成后,設(shè)備廠商可以登錄IoT安全中心 AI算法保護模塊,查看算法授權(quán)信息。包括算法廠商名稱,算法模型名稱,LicenseID,授權(quán)有效期,以及授權(quán)額度等信息。
3.3.2 創(chuàng)建產(chǎn)品
點擊資產(chǎn)管理-直連設(shè)備-創(chuàng)建產(chǎn)品,彈出創(chuàng)建產(chǎn)品的窗口,選擇我需要通過阿里云物聯(lián)網(wǎng)平臺,管理該產(chǎn)品下的設(shè)備。
跳轉(zhuǎn)到物聯(lián)網(wǎng)平臺控制臺。
點擊選擇的實例,在左側(cè)導(dǎo)航欄,選擇設(shè)備管理 > 產(chǎn)品,單擊創(chuàng)建產(chǎn)品:
選擇設(shè)備管理->設(shè)備,單擊添加設(shè)備:
查看設(shè)備詳細(xì),獲取設(shè)備證書(ProductKey、DeviceName、DeviceSecret)信息。
3.3.3 關(guān)聯(lián)產(chǎn)品
?
設(shè)備廠商首先完成產(chǎn)品創(chuàng)建,并記錄產(chǎn)品的productKey信息,通過此步驟完成算法授權(quán)和產(chǎn)品的關(guān)聯(lián)。完成該操作后,允許該產(chǎn)品下指定授權(quán)數(shù)量的IoT設(shè)備可以使用算法廠商所提供的算法。
選擇需要進行關(guān)聯(lián)的授權(quán)記錄,點擊關(guān)聯(lián)產(chǎn)品。
輸入需要關(guān)聯(lián)的產(chǎn)品ProductKey,如果還沒完成產(chǎn)品創(chuàng)建請先完成產(chǎn)品創(chuàng)建。
點擊確認(rèn)按鈕完成產(chǎn)品關(guān)聯(lián)。
3.3.4 設(shè)備端對接
3.3.4.1 SAM SDK框架
IoT Application:
設(shè)備端需授權(quán)保護的應(yīng)用模塊,調(diào)用授權(quán)SDK接口進行許可鑒權(quán),通過LP Linkkit進行授權(quán)許可消息上報和下發(fā)。
IoT Linkkit:
阿里云物聯(lián)網(wǎng)平臺的接入SDK,提供IoT設(shè)備安全連接到阿里云IoT平臺,提供數(shù)據(jù)連云的安全通道,以及業(yè)務(wù)數(shù)據(jù)的管理。
IoT安全SDK:
SAM:IoT授權(quán)許可模塊。
ID2:IoT設(shè)備認(rèn)證模塊,SDK v3.1.0及以上。
OSA:操作系統(tǒng)適配接口,廠商需根據(jù)使用的OS,重新進行接口適配。
HAL:硬件適配接口,提供算法庫和Soft-KM的適配接口,廠商需根據(jù)選擇的硬件平臺,重新進行接口適配。
3.3.4.2 SAM SDK獲取
SAM SDK下載:
SAM Release Package目錄:
目錄/文件 | 說明 |
app | 測試用例,包括HAL和SAM |
example | 演示和試用代碼, 二級目錄說明如下: deps: IoT Linkkit v2.3代碼,只用作演示;項目如有需要,通過官網(wǎng)下載 HTTP - 提供基于HTTP協(xié)議的試用工程,包括demo app、License管理配置和消息轉(zhuǎn)發(fā) mqtt - 提供基于mqtt的端側(cè)示例代碼 |
include | 頭文件 |
libs | 靜態(tài)庫 |
makefile | 編譯腳本 |
make.rules | 編譯系統(tǒng)配置文件,可配置編譯工具鏈和編譯參數(shù) |
sample | 示例代碼,本地環(huán)境的性能測試和試用 |
src | 需適配的OSA和HAL接口和參考實現(xiàn) |
tools | 內(nèi)容打包工具和配置模板 |
libs默認(rèn)提供ID2-KM載體的靜態(tài)庫,其他載體如ID2-SE,可基于已適配和驗證的ID2靜態(tài)庫進行替換,方法如下:
獲取ID2-SE的靜態(tài)庫:libid2.a, libicrypt.a和libkm.a
打包生成最終的ID2靜態(tài)庫:
ar -x libid2.a
ar -x libicrypt.a
ar -x libkm.a
ar rc libid2.a *.o
ranlib libid2.a
rm -rf *.o
rm -rf libicrypt.a
rm -rf libkm.a
3.3.4.3 SAM SDK適配
OSA接口適配:
實現(xiàn)src/osa/ls_osa.c中的接口:
已提供Linux系統(tǒng)的參考實現(xiàn)?。
?
HAL接口適配:
ID2-KM載體:
KM HAL接口適配:
實現(xiàn)deps/src/hal/km/demo/ls_hal_km.c中的接口:
已提供Linux系統(tǒng)的參考實現(xiàn):
單獨預(yù)留的KM安全分區(qū)大于2K, 且需保證在系統(tǒng)升級和重啟時,分區(qū)數(shù)據(jù)不被破壞。
ls_hal_get_id接口,需使用設(shè)備硬件唯一標(biāo)識。
SST HAL接口適配:
實現(xiàn)deps/src/hal/sst/demo/ls_hal_sst.c中的接口:
已提交Linux文件系統(tǒng)的參考實現(xiàn):
需要配置到真實的存儲目錄,且需保證在系統(tǒng)升級和重啟時,分區(qū)數(shù)據(jù)不被破壞。
?
ID2-SE載體:
SST HAL接口適配:
實現(xiàn)deps/src/hal/sst/demo/ls_hal_sst.c中的接口:
已提供Linux文件系統(tǒng)的參考實現(xiàn):
需要配置到真實的存儲目錄,且需保證在系統(tǒng)升級和重啟時,分區(qū)數(shù)據(jù)不被破壞。
?
SDK接口測試:
修改makefile.rules的編譯配置文件:
配置目標(biāo)平臺(pLat := xxx)。
CROSS_COMPILE設(shè)置對應(yīng)的編譯工具鏈。
CFLAGS設(shè)置編譯的配置參數(shù)。
執(zhí)行編譯"make clean & make"。
HAL適配接口測試:
正確運行程序hal_app,可得到如下成功日志:
" ============================> HAL SST Test Pass.“
........
" ============================> HAL KM Test Pass.“ ->【只針對ID2-KM載體】
SAM接口單元測試:
正確運行程序sam_test,可得到如下成功日志:
" =================>SAM Client Unit Test Pass.“
3.3.4.4 SAM SDK集成
授權(quán)初始化:
主要完成授權(quán)SDK的初始化、上行安全通道和上行消息事件的注冊,示例代碼如下:
#include "sam_api.h"
#define SAM_SST_PATH "./" // 安全存儲路徑
#define SAM_DEV_UUID "1234-5678-8765-4321" // 設(shè)備唯一硬件標(biāo)識,如block id, chip id
static sam_context context = {0};
static int on_publish(const char *topic,
const uint8_t *msg, uint32_t size, void *channel, const void *data)
{
/*
* TODO, Wrap and send SAM message through channel
*/
return 0;
}
static void on_message(void *handle, void *channel, iotx_mqtt_event_msg_pt msg)
{
if (!memcmp(SAM_SUB_TOPIC, ptopic_info->ptopic, ptopic_info->topic_len)) {
sam_on_message(handle,
(uint8_t *)ptopic_info->payload,
(size_t)ptopic_info->payload_len);
}
return;
}
int License_Initiaze(char *product_name, char *device_name, void *channel)
{
int ret = 0;
sam_result result = SAM_SUCCESS;
sam_config config;
char pub_topic[128] = {0};
char sub_topic[128] = {0};
config.sst_path = SAM_SST_PATH;
config.dev_uuid = SAM_DEV_UUID;
config.timeout_ms = 10000;
result = sam_set_config(&config);
if (result != SAM_SUCCESS) {
printf("sam set config fail, 0x%x\n", result);
return -1;
}
result = sam_init_context(product_name, device_name, &context);
if (result != SAM_SUCCESS) {
printf("SAM init context fail, 0x%x\n", result);
return -1;
}
result = sam_set_pub_handle(&context, on_publish, channel);
if (result != SAM_SUCCESS) {
printf("SAM set pub_handle fail, 0x%x\n", result);
goto _out;
}
HAL_Snprintf(pub_topic, 128,
SAM_PUB_TOPIC, product_name, device_name);
HAL_Snprintf(sub_topic, 128,
SAM_SUB_TOPIC, product_name, device_name);
result = sam_set_pub_topic(&context, pub_topic);
if (result != SAM_SUCCESS) {
printf("SAM set pub topic fail, 0x%x\n", result);
goto _out;
}
ret = IOT_MQTT_Subscribe(pclient,
sub_topic, IOTX_MQTT_QOS1, on_message, &context);
if (ret < 0) {
printf("subscribe error");
result = SAM_ERROR_GENERIC;
goto _out;
}
_out:
if (result != SAM_SUCCESS) {
sam_final_context(&context);
return -1;
} else {
return 0;
}
}
void License_Finalize(sam_context *context)
{
sam_final_context(context);
}
product_name指產(chǎn)品標(biāo)識(需是LP ProductKey),device_name設(shè)備唯一標(biāo)識(可使用LP DeviceName,或其他設(shè)備硬件唯一標(biāo)識),在同個產(chǎn)品product_name下唯一。
在調(diào)用授權(quán)初始化時,需先完成安全通道的創(chuàng)建,其中channel為安全通道的句柄。
授權(quán)初始化在應(yīng)用/系統(tǒng)進程中,只需調(diào)用一次。
注冊的上行通道pub_handle,只需完成消息的上報。
根據(jù)安全通道協(xié)議的特性,完成授權(quán)下行消息的識別和處理(如MQTT消息訂閱)。
可在sam_config中進行授權(quán)全局配置:
設(shè)置請求超時時間(timeout_ms),超時時間有效值為1000ms - 20000ms, 當(dāng)timeout_ms = 0時,使用默認(rèn)的值10000ms。
許可存儲目錄sst_path:SAM靜態(tài)庫集成時,使用HAL接口中設(shè)置,此處配置不生效。
設(shè)備唯一標(biāo)識dev_uuid:SAM靜態(tài)庫集成時,使用HAL接口中設(shè)置,此處配置不生效。
授權(quán)內(nèi)容解密:
主要完成授權(quán)加密內(nèi)容的解密,接口中會自動觸發(fā)授權(quán)的申請、存儲、加載和校驗等動作,示例代碼如下:
int license_content_decrypt(sam_context *context,
char *license_name, uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
{
sam_result result;
sam_session session;
uint32_t lic_err = 0;
result = sam_open_session(context, &session, license_name);
if (result != SAM_SUCCESS) {
printf("SAM open session fail, 0x%x\n", result);
return -1;
}
result = sam_on_decryption(&session, in, in_len, out, out_len);
if (result != SAM_SUCCESS) {
printf("sam_on_decryption, 0x%x\n", result);
if (result == SAM_ERROR_LICENSE_ERROR) {
sam_get_lic_error_code(&session, &lic_err);
printf("license error code, %d\n", lic_err);
}
goto _out;;
}
result = SAM_SUCCESS;
_out:
sam_close_session(&session);
if (result != SAM_SUCCESS) {
return -1;
} else {
return 0;
}
}
sam_on_decryption接口中包含sam_chk_lic_rights(授權(quán)許可的申請、存儲和校驗等)。
license_name,即時License ID,使用內(nèi)容加密生成的許可文件名(不包含后綴),如不相同,程序會報錯。
sam_on_decryption中調(diào)用sam_chk_lic_rights觸發(fā)授權(quán)連云申請和校驗,因此sam_on_decryption同樣可能阻塞當(dāng)前線程,因此sam_on_decryption和下行消息的處理需在不同線程中。
?
注意事項:
SDK接口中product_name、device_name和license_name是字符串格式,有最大值限制(48、100、48)。
配置的SDK的安全存儲目錄需預(yù)先創(chuàng)建,里面會保存授權(quán)相關(guān)的密鑰和許可,此目錄在正常使用、設(shè)備重啟和系統(tǒng)升級時不會被擦除。
單機授權(quán)在授權(quán)申請,以及發(fā)現(xiàn)異常(如撤銷、過期、時間回滾等)會要求連網(wǎng)進行授權(quán)的云端校驗,如此時網(wǎng)絡(luò)不通/異常,接口sam_chk_lic_rights/sam_on_decryption會返回相應(yīng)的錯誤,可在應(yīng)用程序中顯示對應(yīng)的提示信息:
SAM_ERROR_REVOKED - 設(shè)備已經(jīng)被撤銷。
SAM_ERROR_LICENSE_ERROR - 設(shè)備授權(quán)錯誤,sam_get_lic_error_code獲得錯誤碼。
SAM_ERROR_TIMEOUT - 設(shè)備消息請求響應(yīng)超時。
SAM_ERROR_CONMMUNICATION - 設(shè)備消息上報錯誤,需要連網(wǎng)。
?
參考實現(xiàn):
離線環(huán)境 - 內(nèi)容本地解密:
示例代碼:Release Package/sample/sam/sam_sample.c
可基于此,進行內(nèi)容解密的性能測試。
聯(lián)網(wǎng)環(huán)境 - 授權(quán)許可下發(fā):
示例代碼:sample/sam/mqtt_sam_sample.c
授權(quán)服務(wù)已經(jīng)同LP打通,設(shè)備端可直接調(diào)用授權(quán)消息Topic進行授權(quán)許可消息的上報和下發(fā)。
示例中的LP設(shè)備證書(ProductKey、DeviceName、DeviceSecret)和許可ID,需要替換成真實的數(shù)據(jù)。
LP Linkkit版本不同,Linkkit的接口可能不同,但授權(quán)消息Topic和調(diào)用接口保持不變。
LP Linkkit SDK獲取:
Linkkit v4.x:獲取C Link SDK
Linkkit其他發(fā)布版本:SDK獲取
3.3.5 調(diào)試驗證
軟件集成驗證:
模塊集成SAM SDK后,在每次內(nèi)容解密時,接口內(nèi)部自動調(diào)用許可鑒權(quán)接口進行校驗。
在內(nèi)容第一次解密時,由于設(shè)備上不存在許可緩存,因此需聯(lián)網(wǎng)申請和下發(fā)許可。
當(dāng)設(shè)備上成功下發(fā)和存儲授權(quán)許可,通過許可鑒權(quán)時,且內(nèi)容解密成功,可通過日志查看許可信息:
License ID:許可唯一標(biāo)識,SDK初始化時,由sam_open_session接口參數(shù)license_name傳入。
License interval:許可的離線間隔,超過離線間隔,設(shè)備需再次聯(lián)網(wǎng)更新許可。
License usage left_time:許可的有效剩余時間,單位為毫秒。
License usage count:許可的有效使用次數(shù)。
CRC32:保護內(nèi)容的完整性校驗因子,解密后,通過CRC32校驗,說明內(nèi)容解密正確。
3.3.6 查看使用記錄
請點擊AI算法保護-使用記錄,可查看IoT設(shè)備連接云端平臺獲取授權(quán)的使用記錄信息。
數(shù)據(jù)總覽界面。
已擁有授權(quán):表示算法廠商為其授權(quán)的總配額信息。
已使用:表示設(shè)備廠商已經(jīng)使用的授權(quán)數(shù)量。