を介してPythonプログラムを介してgpgをリモートコントロールしようとしていPOpen
ます。
暗号化されたデータを含むファイルがあり、これを復号化して変更し、再暗号化してディスクに書き戻します。
現在、復号化された情報を一時ファイルに保存しています(shred
プログラムが終了したとき)。次に、そのファイルに変更を加えてから、関数を使用して再暗号化します。この関数は、パスフレーズをパイプで渡しますstdin
。
このコードは次のとおりです。
def encrypt(source, dest, passphrase, cipher=None):
"""Encrypts the source file.
@param source Source file, that should be encrypted.
@param dest Destination file.
@param passphrase Passphrase to be used.
@param cipher Cipher to use. If None or empty string gpg's default cipher is
used.
"""
phraseecho = Popen(("echo", passphrase), stdout=subprocess.PIPE)
gpgargs = [
"gpg",
"-c",
"--passphrase-fd", "0", # read passphrase from stdin
"--output", dest,
"--batch",
"--force-mdc"]
if not cipher is None and len(cipher) > 0:
gpgargs.extend(("--cipher-algo", cipher))
gpgargs.append(source)
encrypter = Popen(
gpgargs,
stdin=phraseecho.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = encrypter.communicate()
rc = encrypter.returncode
if not rc == 0:
raise RuntimeError(
"Calling gpg failed with return code %d: %s" % (rc, stderr))
これは完全にうまく機能しますが、潜在的に機密性の高い復号化されたデータを一時ファイルに保存することは、かなり大きなセキュリティ上の欠陥であると確信しています。
そのため、暗号化/復号化関数を、機密データをディスクに保存することなくメモリ内で完全に機能するように書き換えたいと考えています。
復号化は、復号化されたデータを介してパスフレーズをパイプしstdin
、キャプチャstdout
することにより、簡単に機能します。
一方、パスフレーズとメッセージを「stdin」にパイプすることはできないので、暗号化は私を怒らせます...少なくとも
encrypter.stdin.write("%s\n%s" % (passphrase, message))
うまくいきませんでした。
私の次の最良の推測は、何らかの種類のメモリ内ファイル/パイプ/ソケットなどのファイル記述子を--passphrase-fd
引数として提供することです。問題は、メモリ内ファイルなどがあるかどうか、またはソケットを使用したことがないため、ソケットが適用されるかどうかはわかりません。
誰か助けてくれたり、私の問題に対するより良い解決策を教えてくれたりできますか?
ソリューションは移植可能である必要はありません。Linux のみのアプローチでまったく問題ありません。
前もって感謝します...
編集:
Lars と ryran の両方に感謝します。どちらのソリューションも完璧に機能します。残念ながら、私は1つしか受け入れることができません