複数 Pythonで重要なデータとしてマークする




python グラフタイトル 位置 (4)

私は短い時間の間、ユーザーのパスワードをメモリに保存する必要があります。 どのようにしてこのような情報を誤ってコアダンプやトレースバックに公開することはできませんか? 値を "機密"としてマークする方法はあるので、デバッガでどこにも保存されません。


  • 別のワンタイムパッド付きXOR
  • パスワード自体ではなく、常に塩漬けされたハッシュを保存する

または、ダンプについて非常に妄想的な場合は、他の場所、たとえば異なるスレッド、レジストリ、サーバーなどに独自のランダムキーを格納します。


編集

私はメモリをゼロにするためにctypes(順にCを使います)を使用する解決策を作りました。

import sys
import ctypes

def zerome(string):
    location = id(string) + 20
    size     = sys.getsizeof(string) - 20

    memset =  ctypes.cdll.msvcrt.memset
    # For Linux, use the following. Change the 6 to whatever it is on your computer.
    # memset =  ctypes.CDLL("libc.so.6").memset

    print "Clearing 0x%08x size %i bytes" % (location, size)

    memset(location, 0, size)

私はこのコードの安全性を保証しません。 x86およびCPython 2.6.2で動作することがテストされています。 より長い書き出しがhereありhere

Pythonでの復号化と暗号化は機能しません。 文字列と整数は、中断されず永続的です。つまり、あなたはパスワード情報の混乱を全面に残しています。

ハッシングは標準的な答えですが、最終的にプレーンテキストはどこかで処理される必要があります。

正しい解決策は、機密プロセスをCモジュールとして行うことです。

しかし、あなたの記憶が絶えず妥協されているなら、私はあなたのセキュリティ設定を再考するでしょう。


... これに対する唯一の解決策は、変更可能なデータ構造を使用することです。 つまり、要素を動的に置き換えることができるデータ構造のみを使用する必要があります。 たとえば、Pythonでは、リストを使用して文字配列を格納できます。 ただし、 リストから要素を追加または削除するたびに、実装の詳細に応じて、 リストの背後にリスト全体がコピーされることがあります 。 安全のために、データ構造体のサイズを動的に変更する必要がある場合は、新しい構造体を作成し、データをコピーしてから古い構造体に書き込む必要があります 。 例えば:

def paranoid_add_character_to_list(ch, l):
  """Copy l, adding a new character, ch.  Erase l.  Return the result."""
  new_list = []
  for i in range(len(l)):
    new_list.append(0)
  new_list.append(ch)
  for i in range(len(l)):
    new_list[i] = l[i]
    l[i] = 0
  return new_list

出典: http://www.ibm.com/developerworks/library/s-data.html : http://www.ibm.com/developerworks/library/s-data.html

  • 著者:John Viega([email protected])は、Building Secure Software(Addison-Wesley、2001)とJava Enterprise Architecture(O'Reilly and Associates、2001)の共同執筆者です。 Johnは、主にソフトウェアセキュリティの分野で50以上の技術刊行物を執筆しています。 彼はまた、CおよびC ++コードのセキュリティ脆弱性を発見するためのツールであるMailman(GNUメーリングリストマネージャー)とITS4を書いています。

「センシティブ」としてマークすることはできませんが、メモリ内のデータを暗号化し、使用する必要があるときに復号化することができます。





coredump