<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
深度學習領域,常常用python寫程式碼,而且是建立在一些開源框架之上,如pytorch。在實際的專案部署中,也有用conda環境和python程式碼去部署伺服器,在這個時候,又分為兩種情況。
部署方式可分為兩種,一種是線上部署,演演算法伺服器歸公司所有,只開放API給客戶,客戶通過POST請求存取演演算法伺服器,上傳資料並得到返回結果。這種情況客戶當然看不到程式碼。還有一種是離線部署,就是給客戶私有化部署,把公司的程式碼放到客戶的伺服器上執行,這種情況下客戶能夠看到程式碼。如果是python部署的專案,就需要保護兩個東西,一個是模型檔案,一個是python原始碼。
由於 Python 的動態特性和開源特點,導致 Python 程式碼很難做到很好的加密。在實際工程部署中,如果不想讓客戶看到程式碼,一般使用C++來部署。
可是自己把程式碼改成c++也太費勁了,還好python提供了轉c++程式碼的工具cpython,程式碼轉成c++之後,編譯成.so(linux)的庫檔案,就完成了加密效果了。整個過程已經有人寫好了響應的工具,如jumy,具體參考:GitHub - Boris-code/jmpy: python 程式碼加密|加固
使用之前先安裝jumy
pip install jmpy3
然後找到找到專案目錄,在當前開啟終端,並執行下面命令就能夠完成編譯。
jmpy -i "xxx project dir" [-o output dir]
加密後的檔案預設儲存在 dist/project_name/ 下。注意工程資料夾下,凡是帶有if __name__=="__main__"的只要存在都不編譯,註釋掉一樣不編譯。其他的py檔案才編譯。所以在使用時可以把main檔案暴露出來,其他的檔案都編譯成了.so的庫檔案。
優點:.so檔案為二進位制檔案,無法反編譯出原始碼,原始碼可以得到有效保護。
缺點:編譯過程會編譯一些底層的程式碼進去,如python版本之類的,所以編譯後的工程依舊依賴於環境,不能把其他機器上編譯好的檔案直接拿過去用。
對於一個檔案的加密其實還是容易,這裡我們用AES(一種對稱加密演演算法)對模型檔案進行加密。
首先要安裝一個包,裡面包含很多加密演演算法,ubuntu上安裝命令為‘
pip install pycrypto
然後寫一個python指令碼,實現讀取模型檔案,加密後保護的功能,和讀取加密檔案,解密後儲存的功能。
from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex # 如果text不足16位元的倍數就用空格補足為16位元 def add_to_16(text:bytes): if len(text) % 16: add = 16 - (len(text) % 16) else: add = 0 text = text + (b' ' * add) return text # 加密函數 def encrypt(text:bytes): # key = '9999999999999999'.encode('utf-8') key = 'tqsktqsktqsktqsk'.encode('utf-8') mode = AES.MODE_CBC iv = b'qqqqqqqqqqqqqqqq' text = add_to_16(text) cryptos = AES.new(key, mode, iv) cipher_text = cryptos.encrypt(text) # 因為AES加密後的字串不一定是ascii字元集的,輸出儲存可能存在問題,所以這裡轉為16進位制字串 return b2a_hex(cipher_text) # 解密後,去掉補足的空格用strip() 去掉 def decrypt(text): key = 'tqsktqsktqsktqsk'.encode('utf-8') iv = b'qqqqqqqqqqqqqqqq' mode = AES.MODE_CBC cryptos = AES.new(key, mode, iv) plain_text = cryptos.decrypt(a2b_hex(text)) return plain_text if __name__ == '__main__': # encryption model with open('detect_model/checkpoints/xxx_ori.pth', 'rb') as f1: encrypted = encrypt(f1.read()) with open('detect_model/checkpoints/xxx_encryp.pth', 'wb') as f2: f2.write(encrypted) # decryption model with open("./detect_model/checkpoints/xxx_decryp.pth", 'wb') as f: content = open('detect_model/checkpoints/xxx_encryp.pth', 'rb').read() f.write(decrypt(content))
這裡用的是Crypto.Cipher模組的AES演演算法。模型檔案加密後會比加密前的記憶體大一倍左右。
問題出現了。pytorch讀取模型的函數torch.load()只能讀取檔案,並且返回一個FileIO的物件,來對檔案進行操作。底層都是封死的,如果我們使用加密檔案的時候要先解密成檔案,那還怎麼保密,可是沒有辦法,只能這麼做。
理論上一個可行的辦法是,把加密後的檔案讀入記憶體,然後對讀取的內容(Bytes指標型別)進行解密,此時解密後的內容在記憶體中。但torch.load()只能讀取檔案,所以只能使用C++自己來寫一個工具,完成記憶體解密的內容,載入到pytorch模型的操作,這個流程就比較複雜了,暫時沒有實現。
到此這篇關於Python原始碼加密與Pytorch模型加密分別介紹的文章就介紹到這了,更多相關Python原始碼加密內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45