TensorRT 模型加密雜談
在大多數(shù)項目交付場景中,經(jīng)常需要對部署模型進行加密。模型加密一方面可以防止泄密,一方面可以便于模型跟蹤管理,防止混淆。
由于博主使用的部署模型多為TensorRT格式,這里以TensorRT模型為例,講解如何對模型進行加密、解密以及推理加密模型。
代碼倉庫:https://github.com/laugh12321/TRTCrypto
加密算法的選擇和支持的庫
Crypto++ 是C/C++的加密算法庫,基本上涵蓋了市面上的各類加密解密算法,包括對稱加密算法(AES等)和非對稱加密算法(RSA等)。
兩種算法使用的場景不同,非對稱加密算法一般應用于數(shù)字簽名和密鑰協(xié)商的場景下,而對稱加密算法一般應用于純數(shù)據(jù)加密場景,性能更優(yōu)。在對模型的加密過程中使用對稱加密算法。
簡易版本
以AES-GCM加密模式為例,編寫一個檢測的加密、解密方法
上述代碼,使用AES-CBC加密模式對數(shù)據(jù)進行加密、解密,其中key和iv為加密算法的參數(shù),keySize為key的長度。
加密流程:
初始化加密器,設置key和iv
讀取文件內容并存儲在字符串data中
使用加密器對data進行加密,加密后的內容存儲在字符串cipher中
解密流程:
初始化解密器,設置key和iv
讀取加密后的文件內容并存儲在字符串cipher中
使用解密器對cipher進行解密,解密后的內容存儲在字符串recovered中
轉換為序列化格式
推理加密模型的方法有兩種,一種是將模型解密后保存為文件再進行推理,另一種是將模型解密后轉換為序列化格式,再進行推理。 很明顯第一種方式比較雞肋,因為每次推理都需要進行解密,而且解密后的模型文件也會暴露在外面,不安全。這里使用第二種方式,將模型解密后轉換為序列化格式進行推理。這里給出一個簡單的例子,將存儲解密數(shù)據(jù)的字符串recovered進行序列化。
上述代碼的返回值可以直接作為TensorRT的推理引擎的輸入。例如進行反序列化操作
使用MAC地址作為密鑰
一般情況下,我們只想讓客戶在指定的機器上運行模型,這時候就需要使用機器的唯一標識作為密鑰,這里使用MAC地址作為密鑰。
上述代碼,使用了不同的API獲取MAC地址,其中Windows使用GetAdaptersInfo函數(shù),Linux使用getifaddrs函數(shù)。
有了MAC地址,就可以將MAC地址轉換為密鑰,這里使用SHA256算法對MAC地址進行哈希,然后取前32個字節(jié)作為密鑰。
添加頭部信息
為了新的文件能夠被區(qū)分和可迭代,除了加密后的數(shù)據(jù)外還添加了頭部信息,比如為了判斷該文件類型使用固定的魔數(shù)作為文件的開頭;為了便于后面需求迭代寫入版本號以示區(qū)別;為了能夠在解密時判斷是否采用了相同的密鑰將加密時的密鑰進行SHA256計算后存儲;這三部分構成了目前加密后文件的頭部信息。加密后的文件包含頭部信息 + 密文信息。
上述代碼中,加密函數(shù)EncryptWithHeader中,首先計算密鑰的SHA256哈希值,然后將魔數(shù)、版本號、密鑰哈希值、密文依次拼接,然后使用AES-256-CBC算法加密,最后將頭部信息和密文拼接返回。解密函數(shù)DecryptWithHeader中,首先從密文中提取出頭部信息,然后使用密鑰哈希值驗證密鑰是否正確,最后使用AES-256-CBC算法解密密文。
參考資料
PaddleX-模型加密部署
MegEngine-模型加解密和打包
《機器學習系統(tǒng):設計和實現(xiàn)》-模型的安全保護
Crypto++ GCM Mode