暗号通貨ウォレットの秘密鍵を保存するために、私は簡単なファイル暗号化スクリプトを書きました。もちろん、他のものを暗号化するためにも使えます。
以前はウォレットのリカバリーフレーズをテキストファイルに貼り付けてコンピュータに保存していましたが、もしコンピュータのハードディスクが突然壊れたらどうしようと思いました。先月、コンピュータのマザーボードが壊れて修理に出しましたが、修理できませんでした。ただし、ハードディスクには問題がなく、データはすべて残っています。ただ、いくつかのブラウザの拡張機能にあるウォレットはリカバリーフレーズのバックアップがなく、直接失われてしまいましたが、ほとんどは何も入っていないウォレットです。
それで、ファイルをクラウドにアップロードしました(以前はいつもこうやってバックアップしていました)が、最近、あるクラウドストレージのバグがネットで話題になっていて、他のユーザーが保存したファイルが見えてしまうことがあると聞きました。噂かどうかは調べていませんが、これにより、平文を直接クラウドに保存するのが怖くなりました。以下がこの Python スクリプトのコードです:
locker.py
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
import sys
import getpass
def generate_key(password: str, salt: bytes) -> bytes:
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100000,
backend=default_backend()
)
return kdf.derive(password.encode())
def encrypt_file(password: str, input_file: str, output_file: str):
salt = os.urandom(16)
key = generate_key(password, salt)
aesgcm = AESGCM(key)
nonce = os.urandom(12)
with open(input_file, 'rb') as f:
data = f.read()
encrypted_data = aesgcm.encrypt(nonce, data, None)
with open(output_file, 'wb') as f:
f.write(salt + nonce + encrypted_data)
def decrypt_file(password: str, input_file: str, output_file: str):
with open(input_file, 'rb') as f:
salt = f.read(16)
nonce = f.read(12)
encrypted_data = f.read()
key = generate_key(password, salt)
aesgcm = AESGCM(key)
decrypted_data = aesgcm.decrypt(nonce, encrypted_data, None)
with open(output_file, 'wb') as f:
f.write(decrypted_data)
args = sys.argv
if len(args) != 4:
print("Usage: python locker.py <op_type(encrypt/decrypt)> <input_file> <output_file>")
sys.exit(1)
op_type = args[1]
input_file = args[2]
output_file = args[3]
password = getpass.getpass("Enter password: ")
if op_type == "encrypt":
re_password = getpass.getpass("Re-enter password: ")
if password != re_password:
print("Passwords do not match")
sys.exit(1)
if op_type == "encrypt":
encrypt_file(password, input_file, output_file)
elif op_type == "decrypt":
try:
decrypt_file(password, input_file, output_file)
except:
print("Invalid password")
sys.exit(1)
else:
print("Invalid operation type")
sys.exit(1)
PBKDF2 アルゴリズムを使用して暗号化し、復号化するには自分のパスワードを入力する必要があります。これにより、少なくともセキュリティが向上し、クラウドに保存して漏洩しても損失が発生する確率が比較的小さくなります。
使用方法:
python locker.py <op_type(encrypt/decrypt)> <input_file> <output_file>