python による dicom サーバー — python 難読化

ftp ダウンロードを python でおこない、重要情報は外部ファイルにして難読化します。

なぜここまで ftp にこだわるのかというと、ダウンロードスピードが約 4 倍速いからです。
例えば、全体で 50 MB の dicom ファイルがあるとして、回線速度が 12 MB/sec 程度とすると scp ではダウンロードに 4 – 5 秒かかります。
ところが ftp でダウンロードすると 1 秒程度で済みます。この差はとても大きいと思います。
イントラネットですし、やはり ftp の方がいいと思います。

dcm.py

from flask import Flask, render_template, redirect
import pymysql
import startWeasis
import conf

app = Flask(__name__)

@app.route('/')
def dirlist():
    db = pymysql.connect(
            host='192.168.0.99',
            user=conf.muser,
            password=conf.mpass,
            db='pydcmdb',
            charset='utf8',
            cursorclass=pymysql.cursors.DictCursor,
        )
    cur = db.cursor()
    sql = "SELECT * FROM taginfo;";
    cur.execute(sql)
    mbrs = cur.fetchall()
    cur.close()
    db.close()
    return render_template('select.html', title='flask test', mbrs=mbrs) 
    
@app.route('/detail/<int:studyID>')
def detail(studyID):	
	return redirect('/'), startWeasis.weasis(studyID)

if __name__ == "__main__":
    app.run(debug=True)
startWeasis.py

import os
import shutil
import pymysql
from ftplib import FTP
import conf

def weasis(studyID):
    targetDir = 'pDICOM/' + getPath( studyID )
    shutil.rmtree('/home/user/flask/dcmtemp')
    os.mkdir('/home/user/flask/dcmtemp')
    dwn(targetDir)
    os.system('javaws /var/www/html/weasis/weasisStart.jnlp')

def getPath( studyID ):

    conn = pymysql.connect( host='192.168.0.99',
        db='pydcmdb',
        user=conf.muser,  
        password=conf.mpass,
        cursorclass=pymysql.cursors.DictCursor)
    try:
        with conn.cursor() as cursor:
            cursor.execute( "SELECT path FROM taginfo WHERE studyID = %s", (studyID), )
            res = cursor.fetchone()
            return res['path']  
    finally:
        conn.close()  

def dwn(dir):
    ftp = FTP(
        "192.168.0.11",
        conf.fuser,
        passwd=conf.fpass
    )      
    ftp.cwd(dir)         
    files = ftp.nlst('.')       
    for file in files:
        with open('/home/user/flask/dcmtemp/' + file, 'wb') as f:       
            ftp.retrbinary('RETR %s' % file, f.write)       
    ftp.quit()
       
if __name__ == '__main__':
	weasis()

pyarmour による難読化

conf.py は以下のように平文になっていますが、これを難読化します。

conf.py

muser = "heno"
mpass = "moheno"
fuser = "username"
fpass = "password"

pyarmour のインストール。


pip install pyarmor

conf.py を難読化します。


pyarmor obfuscate conf.py

pytransform というディレクトリが作成されて、conf.py が以下のように難読化されます。


from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x08\x00\x55\.........

これを解読するのはかなり困難なようです。