暗号化
セキュリティに関する注意
jrnl
はベストプラクティスに従っていますが、現実世界で完全なセキュリティを実現することは不可能です。あなたのjrnl
データを少なくとも部分的に侵害する方法はいくつかあります。詳細については、プライバシーとセキュリティのページを参照してください。
暗号化と復号化
既存のプレーンテキストのジャーナルファイルは、--encrypt
コマンドを使用して暗号化できます:
jrnl --encrypt [ファイル名]
その後、新しいパスワードを入力すると、暗号化されていないファイルが新しい暗号化されたファイルに置き換えられます。
このコマンドは、既に暗号化されているジャーナルファイルのパスワードを変更する際にも機能します。jrnl
は現在のパスワードと新しいパスワードの入力を求めます。
逆に、
jrnl --decrypt [ファイル名]
は暗号化されたジャーナルファイルをプレーンテキストファイルに置き換えます。また、ファイル名を指定することもできます(例:jrnl --decrypt plain_text_copy.txt
)。これにより、元の暗号化されたファイルはそのままで、その隣に新しいプレーンテキストファイルが作成されます。
Note
設定ファイルのencrypt
を別の値に変更しても、
ジャーナルファイルの暗号化や復号化は行われません。それはただ、あなたの
ジャーナルが暗号化されているかどうかを示すだけです。したがって、この
オプションを手動で変更すると、ほとんどの場合、ジャーナルファイルを
ロードできなくなります。そのため、上記のコマンドが必要になります。
パスワードをキーチェーンに保存する
誰もjrnl
のパスワードを回復またはリセットすることはできません。パスワードを失うと、
あなたのデータに永久にアクセスできなくなります。
このため、ジャーナルを暗号化する際、jrnl
はパスワードをシステムのキーチェーンに
保存するかどうかを尋ねます。追加の利点として、ジャーナルファイルとやり取りする際に
パスワードを入力する必要がなくなります。
最初にパスワードをキーチェーンに保存しなかったが、後で保存することにした場合
(または、あるコンピューターのキーチェーンには保存したいが、別のコンピューターでは
保存したくない場合)、暗号化されたジャーナルに対してjrnl --encrypt
を実行し、
同じパスワードを再度使用することができます。これによりキーチェーン保存のプロンプトが
トリガーされます。
手動復号化
ジャーナルを復号化する最も簡単な方法はjrnl --decrypt
を使用することですが、
必要に応じてジャーナルを手動で復号化することもできます。これを行うには、
AESアルゴリズム(特にAES-CBC)をサポートする任意のプログラムを使用できます。
復号化には以下の関連情報が必要です:
- キー: 暗号化に使用されるキーは、パスワードの SHA-256ハッシュです。
- 初期化ベクトル(IV): IVは暗号化されたジャーナルファイルの最初の16バイトに 保存されています。
- ジャーナルの実際のテキスト(暗号化されたジャーナルファイルの最初の16バイト 以降のすべて)はUTF-8でエンコードされ、 暗号化される前にPKCS#7に従って パディングされます。
スクリプト形式でどのように見えるかの例が必要な場合は、以下にジャーナルを手動で 復号化するのに使用できるPythonスクリプトの例をいくつか示します。
Note
これらは単なる例であり、jrnl
が存在しなくなっても、ジャーナルファイルが
まだ復元可能であることを示すためにここにあります。可能な場合は
jrnl --decrypt
を使用してください。
jrnl v2ファイルの例:
#!/usr/bin/env python3
"""
jrnl v2の暗号化されたジャーナルを復号化します。
注意:`cryptography`モジュールがインストールされている必要があります
(`pip3 install crytography`のようなコマンドでインストールできます)
"""
import base64
import getpass
from pathlib import Path
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
filepath = input("ジャーナルファイルのパス: ")
password = getpass.getpass("パスワード: ")
with open(Path(filepath), "rb") as f:
ciphertext = f.read()
password = password.encode("utf-8")
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=b"\xf2\xd5q\x0e\xc1\x8d.\xde\xdc\x8e6t\x89\x04\xce\xf8",
iterations=100_000,
backend=default_backend(),
)
key = base64.urlsafe_b64encode(kdf.derive(password))
print(Fernet(key).decrypt(ciphertext).decode("utf-8"))
jrnl v1ファイルの例:
#!/usr/bin/env python3
"""
jrnl v1の暗号化されたジャーナルを復号化します。
注意:`pycrypto`モジュールがインストールされている必要があります
(`pip3 install pycrypto`のようなコマンドでインストールできます)
"""
import argparse
import getpass
import hashlib
from Crypto.Cipher import AES
parser = argparse.ArgumentParser()
parser.add_argument("filepath", help="復号化するジャーナルファイル")
args = parser.parse_args()
pwd = getpass.getpass()
key = hashlib.sha256(pwd.encode("utf-8")).digest()
with open(args.filepath, "rb") as f:
ciphertext = f.read()
crypto = AES.new(key, AES.MODE_CBC, ciphertext[:16])
plain = crypto.decrypt(ciphertext[16:])
plain = plain.strip(plain[-1:])
plain = plain.decode("utf-8")
print(plain)