単純なファイルシュレッダーをc ++で書きたい、つまり、ファイルを削除して回復できないようにするプログラムです。以下はそれを行うための安全で正しい方法でしょうか?
(1)でファイルを開く
ofstream myfile;
myfile.open ("deleteme.txt", ios::out | ios::binary);
(2)次に、次のようなものを10回実行します。
unsigned int x = 0;
for (int i =0; i <= filesize -1; i++)
{
myfile.seekg (i, ios::beg);
myfile << (char)x;
[put new random character in x]
}
(3)次に、ファイルを削除します
if( remove( "deleteme.txt" ) != 0 ) {
cout << "Error deleting file";
}
else {cout << "File successfully deleted";
}
(コンソールでファイルを単に削除することもできると思います。)
削除する前にファイルの名前を変更すると、セキュリティが強化されますか?
ファイルを完全に削除して回復できないようにするために何か他に必要なことはありますか?これで十分ですか?
EDIT1:明確にするために、上記のコードはsime-pseudoです。私の主な懸念は、ファイルをバイト単位で上書きし、ファイルを削除することが回復不能にする良い方法になるかどうかです。
EDIT2:ソフトウェアだけを使用してこれを行う最良の方法に興味があります。
Edit:もう1つ追加します。私は、ソフトウェアの方法による回復を妨げるセキュリティのレベルに主に関心があります。
楽しいプロジェクトのようですね。あなたが「シンプル」と言ったのは知っていますが、とにかく私の考えはここにあります。
ファイルを上書きするデータはランダムではなく、1回のパスでも元のデータの痕跡が残ります。それは記憶媒体に依存します。たとえば、磁気デバイスには磁力顕微鏡があります。同じことを10回行った後でも、追加の特典が追加されているかどうかはわかりません。
ファイルの名前を変更したり削除したりしても、ほとんどのファイルシステムではポインタがデータのあるディスク上の場所に変更されるだけなので、強力な保護は追加されません。ファイルを削除してもポインタは削除されるだけなので、ファイルが実際に存在していても、ディスクはブロックを「使用可能」と見なします。 (これが回復ソフトウェアが機能する理由です。)
完全な安全な削除には、次の機能があります(ソフトウェアベース、ハードウェアソリューションは考慮されていません)。
PRNG( Pseudorandom number generator )は、ファイルに割り当てられたスペースのすべてのバイトに書き込むランダム値を生成します(以下の暗号化機能も参照)。
複数のパス(ここでは慎重に、メディアによって異なります)
すべてが0で、次にすべてが1の実行でも害はありません。これは、予測可能な、しかし微妙なランダム性のパターンを中断するのに役立ちます(コンピューターは真にランダムではないため)。
一部のファイルシステムは「コピーオンライト」であり、一種の「リビジョンコントロール」に似ています。これらは、すでに配置されているデータを上書きしないようにします。その保護を回避する必要があります。
RAIDデバイスは、ディスクへの変更を別のディスクにミラーリングします。
断片化されたファイルは、あるセクターから始まり、ディスクの完全に別の部分で終わる場合があります。または、断片化防止機能により、データの冗長コピーを保持したり、リアルタイムで再配置したりできます。
ソリッドステートドライブは、磁気ドライブとは異なる方法でディスク領域を管理します。ウェアレベリングと相まって、安全なワイピングを少しトリッキーにする技術的な理由があります。 (下記のWikipediaリンクを参照)
ワイプする前にファイルを暗号化すると、「ランダム」ビットでファイルを埋めるのに役立ちます...しかし、安全な細断への最善の答えは、ディスクに到達する前に暗号化することです。
お見逃しなく この素晴らしい質問 は、ソリッドステートドライブ、特にフラッシュドライブの情報の消去について説明しています。 SSDは十分な回数書き込まれた後、摩耗することを覚えておいてください。
より詳細な背景情報については Wikipediaのこの記事 を参照してください。
ちなみに...
もっともらしい否定性を与えるシュレッダーが本当に欲しいです。ファイルを安全に消去し、おとりファイルの残りを削除します。おそらく、ハードドライブの別の場所に存在するユーザーが選択したファイルです。これは、ファイルシステムによって一度にポイントされ、ユーザーによって削除されたファイルのコピーの残りであるように見え、サイズによっては、通常の使用によって徐々に上書きされる可能性があります。
フォレンジックエージェントが通常のシュレッダーが実行されたディスクの部分を調査する場合、ランダムなデータでワイプされたことが簡単にわかります。しかし、おとりファイルがその場所に置かれた場合、私はそれを伝えるのが難しくなると思います。
安全なファイル削除は、アプリケーションではなく、ファイルシステムの要素です。いくつかのファイルシステムは、最も有名なZFSやBTRFSを含め、コピーオンライトメカニズムを使用していますが、シャドウコピーを使用したNTFSもある程度使用しています。したがって、ランダムなデータでファイルを上書きすると、以前は空白であったスペースが割り当てられ、ランダムに埋められます。すべての実用性でやや無意味です。
安全な削除プログラムは、関連するブロックを直接検索して上書きするために、ファイルシステムドライバー自体でなくても、ファイルシステムに対応している必要があります。そしてそれでも、ファイルシステムでさえ、データが上書きされるかどうかに関して最終的なWordを持っていない可能性があります。たとえば、LVMスナップショットとSSDウェアレベリングは、データを実際に上書きすることを防ぎ、代わりに単に空白のセクターを割り当て、代わりにそこにランダムデータを書き込む。
DBANまたは同様の機能を使用して、ドライブ全体を一度にワイプすることで、はるかに優れた安全性を実現できます。
また、技術的には理論的には、磁力顕微鏡などを使用して以前に上書きされたビットを回復できますが、極端な状況であっても、その可能性はほぼゼロです。すべてのビットを手動で、比較的低い成功率で個別に再構築する必要があり、ビットあたりのコストが非常に高い場合でも、それは可能です。今日の高面密度ドライブでは、ありそうもないように見えます。上書きされる前の元の磁気トレースは非常に弱いため、最新のドライブはデータを確実に取得するためだけにECCビットに大きく依存しています。
参照: http://www.anti-forensics.com/disk-wiping-one-pass-is-enough
あなた自身のシュレッダープログラマーを書くべきではありません。代わりに、既存のよく吟味されたシュレッダーをつかみます。
ハードディスクの細断処理については、ATA Secure EraseまたはDBANをお勧めします(詳細については、このサイトを検索してください)。 DBANはオープンソースなので、そのソースを見ることができます。
ファイルの細断処理については、GNUのshred
プログラム(Coreutilsに付属)をお勧めします。 shred
はオープンソースなので、ソースも見ることができます。
プログラムがどんなに注意深く書かれていようと、ファイルレベルの細断処理は多くの状況で本質的に安全ではないことを理解してください。最近のファイルシステムでは、異なるバイトでファイルを上書きしても、ディスク上の元のデータのすべてのコピーが必ず上書きされるわけではありません。場合によっては、ファイルを上書きすると、ファイルシステムがコピーを作成してコピーを変更し、元のデータがファイルレベルのシュレッダーで削除できないハードディスクの別の場所( "空き領域")に残ることがあります。他の場合には、古いデータの残骸が他の理由でハードディスクに残っていることがあります。
ご存知のように、ファイルを削除するだけでファイルシステムにデータが残り、後で上書きされる可能性があります。
ただし、ファイルを1回上書きすると、実際にはデータを回復できなくなりますが、電子顕微鏡でビットごとに分析することにより、部分的にデータを回復するという理論上の脅威はわずかです。この脅威は、理想的な条件下では数ビットではなく、かなりの量(1 kb +〜8192ビットなど)のデータを回復することは実際には実証されていません。 [1] 、 [2] を参照してください。
上書きによる安全な削除の主な問題は、ワイプの回数ではなく、オペレーティングシステム/ハードウェアがデータをどのように処理しているかが正確にわからないことです。たとえば、最初に特定のセクターにファイルを保存したが、そのブロックが後で不良であると判断されたため、データが別のセクターにマップされたとします。フラッシュテクノロジーの制限(特定のブロックの上書きの制限、書き込み前に最初にブロック全体をゼロにする必要がある、次にブロック全体を再書き込みする必要がある)のため、ハードウェアはソリッドステートドライブ(SSD)でさらに悪化し、ハードウェアは可能な限りセクターの再書き込みを回避しようとします最適な操作のために。
解決策:データを秘密にしておく必要がある場合は、フルディスク暗号化を使用してください。暗号化キーが危険にさらされている場合は、ディスク全体を上書きするか(データは依然として不良セクターに存在する可能性があります)、ディスクを物理的に破壊します。