2013-04-09 6 views
5

パスワードは平文で、passWdという文字列の変数に格納されています。 この変数を破棄すると、この変数はどのように解放されますか(たとえば、del passWdまたはpassWd= 'new random data')?Python - 文字列変数の解放/置き換え、どのように処理されるのですか?

文字列は、元々存在していたメモリ領域に上書きできることを意味するバイト配列として格納されているか、または変更できないメモリ領域に固定されたセットです。新しいメモリ領域が作成され、古い領域は破棄されますが、nullで上書きされませんか? Pythonはメモリ領域の安全性を実装し、それについての詳細を知りたいのですがどのように私は興味:)

私は delを使用して、これまでに収集したものから、

(または主な理由は、疑問だ

__del__)は、インタプリタがその変数のメモリ領域を自動的に解放しないため、問題を引き起こす可能性があります。また、デルは値を削除するためには間に合いません。しかし、それは私が集めたもので、黒でも白でもないからです。

私が主張する主な理由は、文字列を取得するハンドオーバアプリケーションを作成しようとしていることです。 Oは、別のサブシステム(例えば、ラズベリーパイのブートローダ)に渡し、インターフェイスはPythonで書かれています(いくつかの人の耳には奇妙に聞こえるはずです)。そして、私がデータが侵害されているのではないかと心配しています/ O計算ではなく、2つのサブシステムハンドオーバ間でメモリダンプが発生している可能性があります。システムが起動してから20分後にシステムがフリーズしているとしたら、できるだけ早く変数を削除していますが、何とかしてもメモリに残っています。

(Ps。

+0

を参照してください。 –

+0

私はそれをすべて読んできました。私がCと似ていないのであれば、malloc経由でメモリ領域を割り当てます。それといくつかのものとそれを解放..'free()'が呼ばれた後に、そのメモリ領域に残っているものを実際に書き直すことはありませんか? – Torxed

+1

これはただ解放されました。メモリ*は他の何かによって使用されるかもしれませんが、それが可能なguararteeはありません。 –

答えて

2

カスタムコード化された入力メソッドを使用してパスワードを取得しない限り、それはもっと多くの場所に存在し、次に不変の文字列になります。だからあまり心配しないでください。

OSは、メモリが別のプロセスに割り当てられる前に、プロセスからのデータが消去されるように注意する必要があります。ページがディスクにコピーされた場合(スワップアウトまたは休止状態の場合)、これはもちろん失敗する可能性があります。

安全なパスワード入力は容易ではありません。おそらく、これを処理する特別なライブラリやモジュールを見つけることができます。

+0

私はCの実装について考える必要がある特定の文字列を処理するので、私はそこに終わるかもしれません。その証拠はPythonが素晴らしいと私は怠け者だが、十分に安全ではないその意味で(それは私が知っていたものになるようには設計されていませんでした)。 'getpass'は、パスワードを' **** 'で置き換えたが、実際にはmakeupで' raw_input'ですか?自動的に読み取った後にデータ領域を置き換えるかどうかを判断します。 – Torxed

0

私はついに2つの解決策を得ました。 ld_preloadは、下位レベルのPythonの文字列処理機能を置き換えます。 もう少し簡単なもう1つのオプションは、Pythonが標準的な文字列処理を提供するより多くの機能を備えた独自のCライブラリを開発することでした。

主にCコードには、文字列が格納されていたメモリ領域やその他のエラーチェックに書き込むshread()関数があります。

しかし、@Berは私自身の解決策を開発するのに十分な答えを与えました(彼が指摘したように)Pythonでは安全な方法がなく、多くの場所に文字列を格納し、OSに依存しますあなたが本当に安全なアプリケーションをインストールしているOSを信頼しない場合を除いて、それ自体は悪いことではありません)。