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.
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.
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()
Sie können sehen, dass das Ergebnis auch korrekt als "Ballspieler" klassifiziert ist.
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.
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]
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
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.
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