Python代码加密
有时候会在共享服务器上运行一些任务,尽管只有root用户才能够看到其他用户的home目录,但是内心还是希望自己的研究内容绝对安全,不被泄露。因此,有必要对自己的代码和数据进行加密。
1. 数据文件加密
思路:
- 在本机(安全设备)加载所有用到的数据文件
- 将它们都放置进一个数据字典里
- 序列化数据(转成二进制文件)
- 采用AES加密二进制数据后存储
- 将加密后的二进制文件拷贝到服务器,在使用时通过getpass()弹出密码提示框进行输入。getpass库使用密码提示模式,密码不明文显示,也不会在ssh中记录。
实现:
使用pickle库和cryptography库分别进行序列化和AES加密操作 :
import pickle
from cryptography.fernet import Fernet
from getpass import getpass
def generateKey():
return Fernet.generate_key()
def encryptMyData(data:any,file_path:str,key:str=None)->None:
if key is None:
key=getpass("Please input your key for encrypt:"+file_path)
data_seq=pickle.dumps(data)
my_fernet=Fernet(key)
token=my_fernet.encrypt(data_seq)
with open (file_path,'wb') as f:
f.write(token)
def decryptMyData(file_path:dict,key:str=None)->any:
if key is None:
key=getpass("Please input your key for decrypt:"+file_path)
with open (file_path,'rb') as f:
token=f.read()
my_fernet=Fernet(key)
data_seq=my_fernet.decrypt(token)
data=pickle.loads(data_seq)
return data
测试:
如果直接使用pickle读取加密后的文件
如果使用错误的key尝试读取文件
如果使用正确的key读取文件
至此,完成了对源数据的加密。
2. 代码文件加密
思路
- 将代码中读取数据文件的地方改成上述decryptMyData()
- 使用encryptMyData对代码进行加密
- 最后写一个不加密的.py调用
假设我们需要加密的主代码是:
mycode='''
import pickle
from cryptography.fernet import Fernet
from getpass import getpass
def decryptMyData(file_path:dict,key:str=None)->any:
if key is None:
key=getpass("Please input your key for decrypt:"+file_path)
with open (file_path,'rb') as f:
token=f.read()
my_fernet=Fernet(key)
data_seq=my_fernet.decrypt(token)
data=pickle.loads(data_seq)
return data
if __name__=="__main__":
#Your code here
data_dict=decryptMyData('MyData.pkl')
from tqdm import tqdm
for i in tqdm(range(10)):
pass
print('This is the main function')
print(data_dict.keys())
'''
加密一下
encryptMyData(mycode,'mycode.pkl',key='aCGnBHDprDp6ItSYpgCNOeNHvD2zxDFBmGaE5uzMKs0=')
然后再写一个不加密的.py调用执行
def decryptMyData(file_path:dict,key:str=None)->any:
if key is None:
key=getpass("Please input your key for decrypt:"+file_path)
with open (file_path,'rb') as f:
token=f.read()
my_fernet=Fernet(key)
data_seq=my_fernet.decrypt(token)
data=pickle.loads(data_seq)
return data
if __name__=="__main__":
mycode=decryptMyData("mycode.pkl")
exec(mycode)
分别输入code的key和data的key后,程序就正常运行啦
至此,我们就完成了对数据和代码的加密,只需要将加密后的data.pkl和code.pkl上传到服务器,然后写一个简单的.py文件进行解密和执行就行啦。即使是root用户,没有key的情况下也只能看到没有加密的空壳.py。