欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python源碼加密與Pytorch模型加密分別介紹

 更新時(shí)間:2022年12月08日 15:11:33   作者:專業(yè)女神殺手  
在實(shí)際的工作中,有時(shí)候我們需要部署自己的Python應(yīng)用,但這時(shí)候我們并不希望別人能夠看到自己的Python源程序。因此,我們需要為自己的源代碼進(jìn)行加密,Python已經(jīng)為我們提供了這樣一套工作機(jī)制

前言

深度學(xué)習(xí)領(lǐng)域,常常用python寫代碼,而且是建立在一些開源框架之上,如pytorch。在實(shí)際的項(xiàng)目部署中,也有用conda環(huán)境和python代碼去部署服務(wù)器,在這個(gè)時(shí)候,又分為兩種情況。

部署方式可分為兩種,一種是在線部署,算法服務(wù)器歸公司所有,只開放API給客戶,客戶通過POST請求訪問算法服務(wù)器,上傳數(shù)據(jù)并得到返回結(jié)果。這種情況客戶當(dāng)然看不到代碼。還有一種是離線部署,就是給客戶私有化部署,把公司的代碼放到客戶的服務(wù)器上運(yùn)行,這種情況下客戶能夠看到代碼。如果是python部署的項(xiàng)目,就需要保護(hù)兩個(gè)東西,一個(gè)是模型文件,一個(gè)是python源代碼。

一、python源代碼的保護(hù)

由于 Python 的動(dòng)態(tài)特性和開源特點(diǎn),導(dǎo)致 Python 代碼很難做到很好的加密。在實(shí)際工程部署中,如果不想讓客戶看到代碼,一般使用C++來部署。

可是自己把代碼改成c++也太費(fèi)勁了,還好python提供了轉(zhuǎn)c++代碼的工具cpython,代碼轉(zhuǎn)成c++之后,編譯成.so(linux)的庫文件,就完成了加密效果了。整個(gè)過程已經(jīng)有人寫好了響應(yīng)的工具,如jumy,具體參考:GitHub - Boris-code/jmpy: python 代碼加密|加固

使用之前先安裝jumy

pip install jmpy3

然后找到找到項(xiàng)目目錄,在當(dāng)前打開終端,并執(zhí)行下面命令就能夠完成編譯。

jmpy -i "xxx project dir" [-o output dir]

加密后的文件默認(rèn)存儲(chǔ)在 dist/project_name/ 下。注意工程文件夾下,凡是帶有if __name__=="__main__"的只要存在都不編譯,注釋掉一樣不編譯。其他的py文件才編譯。所以在使用時(shí)可以把main文件暴露出來,其他的文件都編譯成了.so的庫文件。

優(yōu)點(diǎn):.so文件為二進(jìn)制文件,無法反編譯出源代碼,源碼可以得到有效保護(hù)。

缺點(diǎn):編譯過程會(huì)編譯一些底層的代碼進(jìn)去,如python版本之類的,所以編譯后的工程依舊依賴于環(huán)境,不能把其他機(jī)器上編譯好的文件直接拿過去用。

二、pytorch模型.pth的加密

對于一個(gè)文件的加密其實(shí)還是容易,這里我們用AES(一種對稱加密算法)對模型文件進(jìn)行加密。

首先要安裝一個(gè)包,里面包含很多加密算法,ubuntu上安裝命令為‘

pip install pycrypto

然后寫一個(gè)python腳本,實(shí)現(xiàn)讀取模型文件,加密后保護(hù)的功能,和讀取加密文件,解密后保存的功能。

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
# 如果text不足16位的倍數(shù)就用空格補(bǔ)足為16位
def add_to_16(text:bytes):
    if len(text) % 16:
        add = 16 - (len(text) % 16)
    else:
        add = 0
    text = text + (b'\0' * add)
    return text
# 加密函數(shù)
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)
    # 因?yàn)锳ES加密后的字符串不一定是ascii字符集的,輸出保存可能存在問題,所以這里轉(zhuǎn)為16進(jìn)制字符串
    return b2a_hex(cipher_text)
# 解密后,去掉補(bǔ)足的空格用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算法。模型文件加密后會(huì)比加密前的內(nèi)存大一倍左右。

問題出現(xiàn)了。pytorch讀取模型的函數(shù)torch.load()只能讀取文件,并且返回一個(gè)FileIO的對象,來對文件進(jìn)行操作。底層都是封死的,如果我們使用加密文件的時(shí)候要先解密成文件,那還怎么保密,可是沒有辦法,只能這么做。

理論上一個(gè)可行的辦法是,把加密后的文件讀入內(nèi)存,然后對讀取的內(nèi)容(Bytes指針類型)進(jìn)行解密,此時(shí)解密后的內(nèi)容在內(nèi)存中。但torch.load()只能讀取文件,所以只能使用C++自己來寫一個(gè)工具,完成內(nèi)存解密的內(nèi)容,加載到pytorch模型的操作,這個(gè)流程就比較復(fù)雜了,暫時(shí)沒有實(shí)現(xiàn)。

到此這篇關(guān)于Python源碼加密與Pytorch模型加密分別介紹的文章就介紹到這了,更多相關(guān)Python源碼加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python生成二維碼的教程詳解

    Python生成二維碼的教程詳解

    作為一名合格的?Python?程序員,在工作中必然會(huì)用到二維碼相關(guān)操作,那如何快速的用?Python?實(shí)現(xiàn)呢?別著急,咱們這篇博客就為你解決
    2022-10-10
  • Python爬取qq music中的音樂url及批量下載

    Python爬取qq music中的音樂url及批量下載

    這篇文章主要給大家介紹了利用Python爬取qq music中的音樂url及實(shí)現(xiàn)批量下載的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼,相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • python Boltons庫實(shí)用功能探索(深度復(fù)制類型檢查重試機(jī)制)

    python Boltons庫實(shí)用功能探索(深度復(fù)制類型檢查重試機(jī)制)

    這篇文章主要為大家介紹了python Boltons庫實(shí)用功能探索包含深度復(fù)制類型檢查重試機(jī)制及數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 查看python安裝路徑及pip安裝的包列表及路徑

    查看python安裝路徑及pip安裝的包列表及路徑

    這篇文章主要介紹了查看python安裝路徑及pip安裝的包列表及路徑,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Python中利用mpld3創(chuàng)建交互式Matplotlib圖表的代碼示例

    Python中利用mpld3創(chuàng)建交互式Matplotlib圖表的代碼示例

    mpld3 是一個(gè) Python 庫,它將 Matplotlib 圖表轉(zhuǎn)換為 D3.js(JavaScript 繪圖庫)可解釋的格式,從而實(shí)現(xiàn)了在瀏覽器中顯示并交互的功能,在本文中,我們將介紹如何使用 mpld3 在 Python 中創(chuàng)建交互式 Matplotlib 圖表,并提供代碼示例,需要的朋友可以參考下
    2024-05-05
  • 利用Python3編寫一個(gè)電腦錄屏神器

    利用Python3編寫一個(gè)電腦錄屏神器

    這篇文章主要為大家詳細(xì)介紹了如何利用Python3編寫一個(gè)簡易的電腦錄屏神器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-08-08
  • python動(dòng)態(tài)視頻下載器的實(shí)現(xiàn)方法

    python動(dòng)態(tài)視頻下載器的實(shí)現(xiàn)方法

    這里向大家分享一下python爬蟲的一些應(yīng)用,主要是用爬蟲配合簡單的GUI界面實(shí)現(xiàn)視頻,音樂和小說的下載器。今天就先介紹如何實(shí)現(xiàn)一個(gè)動(dòng)態(tài)視頻下載器,需要的朋友可以參考下
    2019-09-09
  • Python 變量教程私有變量詳解

    Python 變量教程私有變量詳解

    這篇文章主要介紹了Python 變量教程私有變量詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 跟老齊學(xué)Python之使用Python查詢更新數(shù)據(jù)庫

    跟老齊學(xué)Python之使用Python查詢更新數(shù)據(jù)庫

    前面我們講述了使用python操作數(shù)據(jù)庫,今天我們來更進(jìn)一步,介紹下python查詢、更新數(shù)據(jù)庫的相關(guān)操作。有需要的小伙伴自己參考下吧。
    2014-11-11
  • Python中Matplotlib的簡單使用

    Python中Matplotlib的簡單使用

    這篇文章主要介紹了Python中Matplotlib的簡單使用,Matplotlib是一個(gè)用于繪制數(shù)據(jù)可視化圖形的Python庫,支持繪制各種靜態(tài),動(dòng)態(tài),交互式的圖表,它是數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域最流行的可視化庫之一,需要的朋友可以參考下
    2023-07-07

最新評論