どうも、nippa です。
python cryptography で暗号化についてまとめましたが、key をどのように保存するかについて考えていました。
セキュリティ的に可能な方法としては、
- 実行サーバとは別のサーバに保存
- API 化
- key 自体を難読化
1.と 2. は key を物理的に別で保存する方法になります。
物理的に別で保存できない場合は、key を難読化するしかないのかもしれません。
他に方法があれば、教えてもらいところですね。
今回は 3.について python のコード自体を難読化して key を保存を考えてみます。
python のコードの難読化には pyarmor ライブラリを使ってみます。
環境
PyArmor のインストール
PyArmor は pip インストール
$pip install pyarmor
pyarmor でコードの難読化
サンプルとして、以下のソースコードを難読化させてみたいと思います。
hello.py
def hello(): print('Hello world!') def sum(a, b): return a+b
pyarmor で python のソースコードを難読なライブラリ化します。
$pyarmor obfuscate hello.py $ls # 出力結果 dist/ hello.py
dist
ディレクトリが生成され、難読化されたコードが dist 配下に生成されます。
$ls dist/* # 出力結果 dist/hello.py dist/pytransform: __init__.py _pytransform.dylib*
これらのファイルはランタイムファイルと呼ばれます。
dist/hello.py
:難読化された python コードdist/pytransform/pytransform.py
:実行時に使用されるダイナミックライブラリ
になります。dist/hello.py
を難読化する前を同様に読み込むことで実行できます。
dist/hello.py
の中身は、以下のようになっており、難読化されていることがわかります。
from pytransform import pyarmor_runtime pyarmor_runtime() __pyarmor__(__name__, __file__, b'\x50...\x4f/', 2)
難読化コードの実行
難読化されたコードの実行は、難読化前のコード同じように読み込み実行可能です。
難読化前のhello.py
を実行するためのコードとして、以下を利用します。
run.py
import hello hello.hello() print(hello.sum(1, 1))
実行して、結果を確認してみます。
$python run.py # 出力 Hello world! 2
難読化後のコードを読み込んで実行してみます。
run.py
を以下のように変更します。
from .dist import hello hello.hello() print(hello.sum(1, 1))
難読化されたコードdist/hello.py
の import のパスの修正をします。
- from pytransform import pyarmor_runtime + from .pytransform import pyarmor_runtime
これでrun.py
を実行して結果を確認します。
$python run.py # 出力 Hello world! 2
難読化されたライブラリを読み込むことができます。
ライセンス期限の設定
pyarmor で licence を作成して、それを使って難読化することで、ソースコードに使用期限を設定することが可能です。
$pyarmor licenses --expired 2021-01-31 r001
コマンドを実行するとlicenses
ディレクトリが作成されます。
$ls -R licenses #出力 r001/ licenses/r001: license.lic license.lic.txt
生成されるファイルの詳細は以下の通りです。
licence.lic
: ライセンスファイルlicense.lic.txt
: ファイルの詳細
このlicence.lic
を pyarmor 実行時にオプションで読むことで、ライセンスの有効期限を設定することが可能なります。
ちなみに、指定しない場合(デフォルト)ではライセンスの期限が無期限になります。
ライセンスの指定オプションは以下の通りです。
$pyarmor obfuscate --with-license licenses/r001/license.lic hello.py
これで難読化のコードにライセンスの有効期限を設定することが可能です。
感想
key を難読化させることで多少なり key のセキュリティを上げるために、pyaromr ライブラリを使ってコードの難読化をしてみました。
意外と簡単に難読化でき、さらにはライセンスの有効期限も設定できました。
key 自体は別サーバにおいて都度、取得する方法のが良いのですがどうしてもという場合に使えるかと思います。
単に、ソースコードを難読化するためでも良いのかと思いました。
pyaromr を使えば、簡単なライセンス管理が可能になりますね。
ではでは、また次回。