PyArmor ~ Einfache Möglichkeit, Python-Quellcode zu verschlüsseln und bereitzustellen ~

Einführung

Ich denke, bei der Vertragsentwicklung gibt es Situationen, in denen Sie die Ergebnisse an den Kunden liefern müssen. In einem solchen Fall, wenn die Funktion beispielsweise als SaaS bereitgestellt werden kann, greift die Clientseite auf die API zu und verwendet die Funktion. Daher ist es natürlich nicht möglich, den Quellcode auf dieser Seite zu erfassen. Ich denke jedoch, dass es viele Situationen gibt, in denen dies nicht realistisch ist. Es gibt eine Bibliothek namens PyArmor, die in solchen Fällen nützlich ist. PyArmor ist eine Bibliothek, die den Quellcode verschlüsselt, und theoretisch kann der Quellcode nicht wiederhergestellt werden. Es ist eine sehr praktische Bibliothek, wenn Sie den Quellcode schnell bereitstellen möchten. Zusätzlich zur reinen Verschlüsselung ist es auch möglich, nach Erteilung verschiedener Lizenzen (Verwendbarkeitsdauer, Ausführungsgerät usw.) zu verschlüsseln. In Bezug auf PyArmor werden andere Artikel veröffentlicht, wenn Sie googeln. Da sich die technischen Daten jedoch geringfügig geändert haben, habe ich diesmal versucht, sie als Artikel zusammenzufassen, einschließlich der Bedeutung des Memos. Informationen zur Verwendung von PyArmor finden Sie im folgenden offiziellen Dokument.

Offizielles PyArmor-Dokument

Der Quellcode für diesen Blog ist auf [GitHub] veröffentlicht. Die erforderlichen Bibliotheken finden Sie in der lokalen Umgebung von Mac für die Umgebung und Pipfile für die erforderlichen Bibliotheken.

Eigentlich versuchen

Vor der Verschlüsselung

Hier ist der Code vor der Verschlüsselung. [Single_Module] Nach dem Lesen der Bilddatei wird das trainierte VGG16-Modell zur Bildklassifizierung und Bildanzeige verwendet.

Single_Module/main.py


import os
import sys
import cv2
import numpy as np
import matplotlib.pyplot as plt
import torch
from torchvision import models, transforms

sys.path.append(os.path.abspath('..'))
import imagenet_class


img = cv2.imread('../baseball.png')
img = cv2.resize(img, (256, 256))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_tensor = transforms.ToTensor()(img)
img_tensor = img_tensor.unsqueeze_(0)

model = models.vgg16(pretrained=True)

output = model(img_tensor)
output = np.argmax(output.detach().numpy())

print(imagenet_class.target[str(output)][1])   # ballplayer

plt.imshow(img)
plt.show()

スクリーンショット 2020-08-26 18.31.36.png

Sie können sehen, dass das Ergebnis auch korrekt als "Ballspieler" klassifiziert ist.

Verschlüsselung

Mit dem folgenden Befehl verschlüsseln.

$ pyarmor obfuscate main.py 

Nach der Ausführung wird das Verzeichnis "dist" direkt darunter erstellt. Der Inhalt der Datei ist wie folgt.

Lizenzierte Verschlüsselung

Führen Sie zunächst den folgenden Befehl aus, wie Sie im Abschnitt "Generieren der Lizenz für verschleierte Skripte" der offiziellen Dokumentation sehen können: (Freier Name wie r001)

$ pyarmor licenses --expired 2022-01-01 r001

Dann wird das Verzeichnis "Lizenzen" direkt darunter erstellt, und verschiedene Dateien werden darunter erstellt. Als nächstes wird die Hauptdatei wie zuvor mit dem Befehl pyarmor obfuscate verschlüsselt, aber mit den folgenden Optionen ausgeführt.

$ pyarmor obfuscate --with-license licenses/r001/license.lic main.py

Dann ist es möglich, in Form einer Lizenz mit einem Ablaufdatum zu verschlüsseln. [Single_Module_Obfuscating_pre]

Ausführung verschlüsselter Dateien

Die verschlüsselte Hauptdatei kann wie ein normales Python-Skript ausgeführt werden. Die bisher verschlüsselte Hauptdatei befindet sich direkt im Verzeichnis "dist", sodass sich der relative Pfad geringfügig vom Original unterscheidet. Um die Pfade auszurichten, habe ich daher eine Konfiguration wie [Single_Module_Obfuscating] vorgenommen. Ich habe mich nur mit dem Ändern des Speicherorts der Dateien beschäftigt. Versuchen Sie, den folgenden Befehl auszuführen.

$ python main.py

【Ergebnis】

[out] ballplayer

スクリーンショット 2020-08-26 18.31.36.png

Sie können sehen, dass das Ergebnis genau das gleiche ist wie vor der Verschlüsselung. Versuchen wir auch zu sehen, wie die Hauptdatei aussieht.

$ cat main.py

from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52 ...(Unten weggelassen)

Sie können sehen, dass es normalerweise auf diese Weise verschlüsselt wird. Wie bereits erwähnt, ist für die Ausführung dieser Hauptdatei immer die gleichzeitig generierte dynamische Bibliothek erforderlich.

Verschleierung einschließlich .py-Dateien in verschiedenen Verzeichnissen

Bei der vorherigen Methode werden alle direkt darunter liegenden ".py" -Dateien standardmäßig verschlüsselt. Wenn Sie alle .py-Dateien einschließlich der Unterverzeichnisse rekursiv verschlüsseln möchten, führen Sie sie mit den folgenden Optionen aus.

$ pyarmor obfuscate --recursive main.py

Ich werde es versuchen. [Whole_Module] ist der Quellcode vor der Verschlüsselung, aber er ist der gleiche wie zuvor. (Trennen Sie einfach die Dateien) Die main.py direkt darunter liest das model / model.py unter dem Unterverzeichnis.

Whole_Module/model/model.py


from torch import nn
from torchvision import models


class SampleModel(nn.Module):
    def __init__(self):
        super(SampleModel, self).__init__()
        self.backborn = models.vgg16(pretrained=True)

    def forward(self, x):
        x = self.backborn(x)
        return x

Whole_Module/main.py


import os
import sys
import cv2
import numpy as np
import matplotlib.pyplot as plt
import torch
from torchvision import transforms

from model.model import SampleModel
sys.path.append(os.path.abspath('..'))
import imagenet_class


img = cv2.imread('../baseball.png')
img = cv2.resize(img, (256, 256))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_tensor = transforms.ToTensor()(img)
img_tensor = img_tensor.unsqueeze_(0)

model = SampleModel()

output = model(img_tensor)
output = np.argmax(output.detach().numpy())

print(imagenet_class.target[str(output)][1])

plt.imshow(img)
plt.show()

Wenn Sie nun den vorherigen Befehl ausführen, wird ein neues Verzeichnis "dist" erstellt und die verschlüsselte Bibliothek "main.py", "model.py" und die dynamische Bibliothek werden erstellt. [Whole_Module_Obfuscating_pre]. Da es jedoch aus demselben Grund wie zuvor nicht ausgeführt werden kann (der relative Pfad der Bilddatei ist unterschiedlich), wurde die generierte Datei verschoben. Dies kann auch nach wie vor problemlos durchgeführt werden. [Whole_Module_Obfuscating]

Recommended Posts

PyArmor ~ Einfache Möglichkeit, Python-Quellcode zu verschlüsseln und bereitzustellen ~
Einfache Möglichkeit, die Quelle der Python-Module zu überprüfen
Einfache Möglichkeit, den Python-Import anzupassen
Einfache Möglichkeit, Wikipedia mit Python zu verwenden
Einfache Möglichkeit, Python 2.7 unter Cent OS 6 zu verwenden
Liste des zu verschiebenden und zu merkenden Python-Codes
Eine einfache Möglichkeit, Java von Python aus aufzurufen
Unterschiede beim Schreiben von externem Quellcode zwischen Ruby und Python
Schreiben Sie Python2-Code in Python3 um (2to3)
Einfache Möglichkeit, mit Google Colab mit Python zu kratzen
Es ist nicht einfach, Python zu schreiben, es ist einfach, numpy und scipy zu schreiben
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
Analysieren von Java-Quellcode mit AST (Abstract Syntax Tree) mithilfe von ANTLR und Python
Tipps zum Codieren kurz und einfach in Python zu lesen
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
[Python] Einfache Möglichkeit, Energiedaten interaktiv zu visualisieren [plotly.express]
[Python] Eine andere Möglichkeit zum Importieren
Einfache Möglichkeit, Dateien umzubenennen
Quellinstallation und Installation von Python
Eine einfache Möglichkeit, die in Python benötigte Zeit anzuzeigen und sie intelligenter zu verbessern
Konvertieren Sie Python 3.x-Code in Python 2.x.
Eine einfache Möglichkeit, die Amazon-Produkt-API in Python aufzurufen
Führen Sie Jupyter mit der REST-API aus, um Python-Code zu extrahieren und zu speichern
Einfache Möglichkeit, nach dem Dezimalpunkt in Python3 abzurunden
[PEP8] Übernehmen Sie den Python-Quellcode und schreiben Sie ihn ordentlich
Codieren Sie Python, um zu überprüfen und grafisch darzustellen, ob es dem Gesetz von Benford entspricht
So erstellen Sie eine Python- und Jupyter-Ausführungsumgebung mit VSCode
So zeigen Sie Bytes in Java und Python auf die gleiche Weise an
Python 3.6 unter Windows ... und zu Xamarin.
[Einführung in Python3 Tag 1] Programmierung und Python
Einfach zu bedienendes Jupyter-Notebook (Python3.5)
Python-Protokollierung und Dump an JSON
Selen und Python zum Öffnen von Google
Einfaches Erlernen von Python beim Schreiben
[Python] Lesen Sie den Flask-Quellcode
[Python Tutorial] Eine einfache Einführung in Python
Codebeispiel zum Abrufen von oauth_token und oauth_token_secret der Twitter-API in Python 2.7
Versuchen Sie, Python-Code zu schreiben, um Go-Code zu generieren. - Versuchen Sie, JSON-to-Go usw. zu portieren
Python-Code zum Trainieren und Testen mit Custom Vision of Cognitive Service
Installation von Visual Studio Code und Installation von Python
Von Python bis zur Verwendung von MeCab (und CaboCha)
So installieren und verwenden Sie pandas_datareader [Python]
Python> Link> Verhalten / Code von Strftime () und strptime ()
Binden Sie Methoden an Python-Klassen und -Instanzen
Holen Sie sich Python-Quellcode-Metriken mit Radon
Fraktal zum Erstellen und Spielen mit Python
Portieren und Ändern des Doublet-Solvers von Python2 auf Python3.
Lesen Sie Python csv und exportieren Sie es nach txt
Python: Verwendung von Einheimischen () und Globalen ()
Fluss vom Quellcode zum Erstellen des Ausführungsformats
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Einfache Einführung in die Python3-Serie und OpenCV3
Einfaches Web-Scraping mit Python und Ruby
Verwendung ist und == in Python