IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

python PyArmorでコードの難読化

どうも、nippa です。

python cryptography で暗号化についてまとめましたが、key をどのように保存するかについて考えていました。

セキュリティ的に可能な方法としては、

  1. 実行サーバとは別のサーバに保存
  2. API
  3. 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 を使えば、簡単なライセンス管理が可能になりますね。

ではでは、また次回。