現在RPGを開発していますが、プレイヤー/ユーザーが簡単に読み取ったり変更したりできないように、保存されたデータをどのように保護できるかを尋ねています。はい、コンピューターとプログラミングの経験がある人はそれを変更できますが、ラムダユーザーがプレーンテキストのxmlファイルを変更できるのと同じくらい簡単に変更できるようにしたくありません。
Pythonでそれを行う方法はありますか?
圧縮pickle
をcpickle
最大に設定した構成オブジェクトのみを使用することは、迅速かつ簡単なオプションです。
暗号化ライブラリが必要なようです。これは、キーを使用してファイルを暗号化または復号化するのに役立ちます。良いことに、PyCrypto と呼ばれるものが既に存在します。ここからダウンロードできます。
それを使用するには、ダウンロードしたらここに文書化されています:
import string
from Crypto.Cipher import AES
from Crypto import Random
from Crypto.Random import random
def gen_cipher():
# generates 32 letter long key
key = ''.join(random.sample(string.ascii_letters, 32))
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
return cipher, iv
def write_data(data, rfile, cipher, iv):
with open(rfile, 'w') as f:
msg = iv + cipher.encrypt(b'Users cant edit this')
f.write(msg)
def read_data(rfile, cipher):
with open(rfile, 'r') as f:
data = f.read()
# first 16 bytes are IV
return cipher.decrypt(data)[16:]
def encrypt_existing_file(infile, outfile, cipher, iv):
with open(infile, 'r') as if:
data = if.read()
write_data(data, outfile, cipher, iv)
def decrypt_existing_file(infile, outfile, cipher, iv):
with open(outfile, 'r') as of:
data = read_data(infile)
of.write(data)
if __name__ == '__main__':
cipher, iv = gen_cipher()
write_data(b"You didn't see anything...", 'file.txt', cipher, iv)
# ...
# outputs: You didn't see anything...
print (read_data('file.txt', cipher))
AES を対称鍵暗号として使用することで機能します。最初に、ランダムに選択された 32 個の ASCII 文字からランダム キーを生成します。次に、初期化ベクトルを作成します (iv)。これは、適切に初期化するために、暗号化されたファイルの開始時に必要です。次に、キー、操作モード、および初期化ベクトルを受け取る暗号自体です。CFB モード (Cipher Feedback Mode) は、次のブロックが前のブロックに多少依存する方法で AES が使用されることを意味します。Udacity には、対称暗号、AES、およびCBCに関する優れたビデオがいくつかあります。
ピクルスが大きすぎるかもしれません。そして、場合によっては奇妙な動作をします。ZIP では、アーカイブのさまざまな部分からデータを読み書きできます。
パスワード付きのzipを試すか、ファイルの最初のバイトを変更して、通常のアンパックを防ぎます
PS。いくつかの異なるバリアントを作成し、サイズ/速度を確認します