クラスに変数を復号化して返すメソッドがあります。使用後、返された変数を「del」で削除します。
これらのガベージ値がアクセスされることの危険性は何ですか...どうすればそれらから身を守ることができますか?
コードは次のとおりです。
import decrypter
import gc
# mangled variable names used
def decrypt(__var):
__cleartext = decrypter.removeencryption(__var)
return __cleartext
__p_var = "<512 encrypted password text>"
__p_cleartext = decrypt(__p_var)
<....do login with __p_cleartext...>
del __p_var, __p_cleartext
gc.collect()
この時点で、__var や __cleartext などの変数が悪用される可能性はありますか?
ありがとう!
私はもう少しグーグルをしました。間違った道をたどる数時間を費やす前に...私が聞いているのは次のとおりです。
- パスワードをソルト付きハッシュとしてシステムに保存します (これは現在実行中です)。
- ハッシュのソルトは、スイートの開始時にユーザーが入力する必要があります (現在行われています)。
- ただし、salt は Python ではなく C プロセスで保持する必要があります。
- Python スクリプトは、復号化のためにハッシュを C プロセスに渡す必要があります。
Python スクリプトは mysql データベースのログインを処理しており、DB 接続を開くにはパスワードが必要です。
コードが次の行に沿っていた場合...
# MySQLdb.connect(host, user, password, database)
mysql_host = 'localhost'
mysql_db = 'myFunDatabase'
hashed_user = '\xghjd\xhjiw\xhjiw\x783\xjkgd6\xcdw8'
hashed_password = 'ghjkde\xhu78\x8y9tyk\x89g\x5de56x\xhyu8'
db = MySQLdb.connect(mysql_host, <call_c(hashed_user)>, <call_c(hashed_password)>, mysql_db])
これは(少なくとも)ゴミがいたるところに残っているpythonの問題を解決しますか?
Ps memset ( Mark data assensitive in python ) に関する投稿も見つけましたが、C を使用してハッシュを復号化する場合、これは役に立ちません。
PPS dycrypter は現在 Python スクリプトです。スクリプトに memset を追加してから、py2exe または pyinstaller を使用して「コンパイル」するとしたら、これは実際にパスワードを保護するのに役立ちますか? pyinstaller が行うことは、通常のインタープリターとローカル インタープリターが作成する同じバイトコードをパッケージ化することだけなので、私の本能はノーと言います...しかし、私はそれについて十分に知りません...?
それで...暗号化モジュールをCで作成するというAyaの提案に従って、次のセットアップでどれだけの識別可能なメモリフットプリントが残るでしょうか。大きな問題の一部は次のとおりです。パスワードを解読する機能は、繰り返し呼び出されるため、プログラムの実行中ずっと利用可能である必要があります...これは1回限りのものではありません.
ユーザーがログインしたときに開始される C オブジェクトを作成します。これには復号化ルーチンが含まれており、ログイン時にユーザーが入力したソルトのコピーを保持します。保存されたソルトは、ランダムに生成されたソルトを使用して独自の暗号化ルーチンによってハッシュされることにより、実行中のオブジェクト (メモリ内) で隠されます。
ランダムに生成されたソルトも、オブジェクトの変数に保持する必要があります。これは実際にはソルトを保護するためではなく、誰かがメモリ フットプリントをのぞき見した場合にメモリ フットプリントを難読化しようとするためです (ソルトを特定しにくくします)。つまり、c-obj
mlock() /*to keep the code memory resident (no swap)*/
char encrypt(data, salt){
(...)
return encrypted_data
}
char decrypt(data, salt){
(...)
return decrypted_data
}
stream_callback(stream_data){
return decrypt(stream_data, decrypt(s-gdhen, jhgtdyuwj))
}
void main{
char jhgtdyuwj=rand();
s-gdhen = encrypt(<raw_user_input>, jhgtdyuwj);
}
次に、Python スクリプトは C オブジェクトを直接呼び出します。これにより、暗号化されていない結果が直接 MySQLdb 呼び出しに渡され、変数に戻り値が格納されることはありません。いえ
#!/usr/bin/python
encrypted_username = 'feh9876\xhu378\x&457(oy\x'
encrypted_password = 'dee\x\xhuie\xhjfirihy\x^\xhjfkekl'
# MySQLdb.connect(host, username, password, database)
db = MySQLdb.connect(self.mysql_host,
c-obj.stream_callabck(encrypted_username),
c-obj.stream_callback(encrypted_password),
self.mysql_database)
これにより、スヌープされる可能性のあるメモリフットプリントはどのようなものになるでしょうか?