3

Delphiで文字列を「ワイプ」することは可能ですか? 説明させてください:

ユーザーを承認するための DLL を含むアプリケーションを作成しています。暗号化されたファイルを XML DOM に読み込み、そこにある情報を使用して、DOM を解放します。

暗号化されていない XML がまだ DLL のメモリに残っていることは明らかであり、調査に対して脆弱です。ここで、これを過度に保護するつもりはありません。ユーザーは別の DLL を作成することができますが、ユーザー名が何年にもわたってメモリに留まるのを防ぐための基本的な手順を実行したいと思います。ただし、参照があるため、とにかく簡単にメモリを消去できるとは思いません。DOM (TNativeXML クラス) をトラバースし、すべての文字列インスタンスを見つけて "aaaaa" のようなものにすると、実際には新しい文字列ポインターが DOM 参照に割り当てられず、古い文字列がそのまま残ります。再割り当てを待っているメモリがありますか?唯一の元のコピーを強制終了していることを確認する方法はありますか?

または、D2007 には、未使用のメモリをすべてヒープから消去するように指示する手段がありますか? そのため、DOM を解放してから、消去するように指示できます。

または、次のタスクを続行して、これを忘れる必要があります。

4

11 に答える 11

7

ユーザーがDLLを使用してプロセスのメモリを読み取ることができる場合、同じユーザーが任意の時点で実行を停止することもできるため、気にする価値はないと思います。メモリが消去される前に実行を停止しても、ユーザーは暗号化されていないデータに完全にアクセスできます。

IMO 十分に興味があり、説明したことを実行できるユーザーは、DLL がメモリを消去しても深刻な不便はありません。

于 2009-02-11T11:51:23.990 に答える
4

これに関する 2 つの一般的なポイント:

第一に、これは「尋ねなければならない場合、おそらくこれを行うべきではない」領域の 1 つです。それを誤解しないでください。あなたのプログラミングスキルを軽視しているわけではありません。安全で暗号的に強力なソフトウェアを作成することは、あなたが専門家であるか、そうでないかのどちらかです。「少しだけ空手を知っている」ことが空手をまったく知らないよりもはるかに危険であるのと同じように. Delphi でセキュアなソフトウェアを作成するためのサードパーティ製ツールが多数あり、専門家によるサポートが利用できます。Windows の暗号化サービス、暗号化の数学的基礎、およびサイド チャネル攻撃を打ち負かした経験がなくても、「自力で解決」しようとするのではなく、それらを使用することを強くお勧めします。

特定の質問に答えるには: Windows API には、CryptProtectMemoryなどの便利な関数が多数あります。ただし、メモリを暗号化しても、システムの他の場所に穴が開いていたり、サイド チャネルが公開されていたりすると、誤った安心感がもたらされます。それは、ドアに鍵をかけるのに、窓を開けたままにしておくようなものです。

于 2009-02-11T17:10:38.607 に答える
3

このようなものはどうですか?

procedure WipeString(const str: String);
var
  i:Integer;
  iSize:Integer;
  pData:PChar;

begin
    iSize := Length(str);
    pData := PChar(str);

    for i := 0 to 7 do
    begin
      ZeroMemory(pData, iSize);
      FillMemory(pData, iSize, $FF); // 1111 1111
      FillMemory(pData, iSize, $AA); // 1010 1010
      FillMemory(pData, iSize, $55); // 0101 0101
      ZeroMemory(pData, iSize);
    end;
end;
于 2010-03-30T22:15:18.363 に答える
2

DLL は割り当てられたメモリを所有していませんが、プロセスは所有しています。特定のプロセスによって割り当てられたメモリは、プロセスが終了すると、DLL が (別のプロセスによって使用されているため) ぶら下がっているかどうかにかかわらず破棄されます。

于 2009-02-11T11:43:13.153 に答える
1

FastMMメモリマネージャをフルデバッグモードで使用する場合は、解放時にメモリを強制的に上書きすることができます。

通常、その動作はワイルドポインターを検出するために使用されますが、必要に応じて使用することもできます。

一方、Craig Stuntzが書いていることを理解していることを確認してください。この認証と承認を自分で書くのではなく、可能な限り基盤となるオペレーティングシステムを使用してください。

ところで:Hallvard VassbotnはFastMMについての素敵なブログを書きました:http: //hallvards.blogspot.com/2007/05/use-full-fastmm-consider-donating.html

よろしく、

Jeroen Pluimers

于 2009-02-11T21:46:59.343 に答える
1

XML DOM の代わりに SAX プロセッサを使用してファイルをストリームに復号化し、検証を行ってから、復号化されたストリームを上書きしてから解放するのはどうですか?

于 2009-02-11T11:23:00.330 に答える
0

復号化された XML を、文字列ではなく文字またはバイトの配列にロードすることは可能でしょうか? 次に、コピーオンライト処理がないため、メモリを解放する前に #0 で埋め戻すことができますか?

char の配列を文字列に割り当てる場合は注意してください。Delphi には、char の従来のパックされた配列 [1..x] との互換性を保つためのスマートな処理があります。

また、ShortString を使用できますか?

于 2009-02-11T21:57:56.743 に答える
0

面倒ですが、ヒープが機密データでいっぱいになっている間に使用したヒープサイズをメモし、それが解放されたときに GetMem を実行して、その 200% にまたがる大きなチャンクを割り当てることができます。そのチャンクに対して Fill を実行し、フラグメンテーションは無関係であると仮定して、審査官にとって非常に有用です。ブライ

于 2009-02-11T11:16:13.640 に答える
0

パスワードを XML のハッシュ値として保持し、入力パスワードのハッシュを XML のハッシュ化されたパスワードと比較して検証するのはどうでしょうか。

編集:すべての機密データを暗号化し、可能な限り最後の瞬間にのみ復号化できます。

于 2009-02-11T11:37:07.567 に答える
0

XML を使用してパスワードを保存する場合、たとえ暗号化されていても、ユーザーを危険にさらすことになります。より良い方法は、代わりにパスワードのハッシュ値を保存し、そのハッシュを入力したパスワードと比較することです。このアプローチの利点は、ハッシュ値を知っていても、ハッシュを作成するパスワードがわからないことです。ブルート フォース識別子 (無効なパスワードの試行をカウントし、一定回数後にアカウントをロックする) を追加すると、セキュリティがさらに向上します。

文字列のハッシュを作成するために使用できる方法がいくつかあります。良い出発点は、ターボ パワーのオープン ソース プロジェクト「LockBox」を調べることです。一方向ハッシュ キーを作成する例がいくつかあると思います。

編集

しかし、一方通行の場合、ハッシュ値を知ることはどのように役立つのでしょうか? あなたが本当に偏執狂的であるなら、あなただけが知っている予測可能な何かによってハッシュ値を変更することができます...たとえば、特定のシード値と日付を使用した乱数です。その後、比較の開始点として使用できるように、十分な量のハッシュのみを xml に格納できます。疑似乱数ジェネレーターの良いところは、同じシードを指定すると常に同じ一連の「乱数」を生成することです。

于 2009-03-10T17:38:18.787 に答える