今まで使っていたパソコンを廃棄するとき、使っていたファイルをどう削除するかというのが、セキュリティ上問題となります。
まあ、いままでは、ごみ箱を空にしたのちデフラグでもかけて安心していたわけですが、最近はセキュリティ意識の高まりのためかファイルの中身を意味のないビット列で上書きしないと、という風潮が高まってきました。パソコンを単純に廃棄するのであれば、ハードディスクを物理的に破壊するという手段がありますが、自分が使わなくなっても誰かが使う場合、そうするわけにはいきません。例えば、会社で使っているPCを異動の際後任に引き継ぐとか、社内で使い回しするとか、リース会社に引き取ってもらうとか、中古として売却するとか、そういったときです。この場合、自分のファイルを後腐れなく捨てるという処理が必要になります。
そういった時のことを考えてでしょう、ファイルを捨てるとき、ファイルの内部を無意味な文字列で上書きしてくれるというツールがいくつかあります。Norton SystemWorksにもついています。が、それらには共通の限界がありました。「すでに捨てたファイルを消すことはできない」ということです。
つまり、ファイルを消してもディスク上には情報の痕跡が磁気として残っているわけですが、これを消すことが出来ない。たとえファイルは無くなっていても、ディスクのダンプをとれば、ファイルの中身がある程度見られてしまいます。これも、気にするといえば気にしなければなりません。では、そういったファイルの痕跡まで消すにはどうすればよいか。なんかツールがないかな、と探してみました。ないわけではない。が、私の見た範囲のものはPCを別のOSで起動して、ディスクごとフォーマットし、ディスク全体を0なり1なりで埋め尽くしてしまうという仕様でした。確かにこういった使用する場面を考えれば、この動きで問題ないはずです。どうせ後で使うとしてもシステムを再インストールするはずですから。
が、実際問題として、できればインストール済みのOSやアプリケーションを生かしたままで、ディスクの空き領域のみを無意味なビット列で埋め尽くしておきたい、という要望があるのではないでしょうか。
例えば先ほどもあげました「会社で使っているPCを異動の際後任に引き継ぐ」場合や、不要機器を他部署で転用する場合です。そのPCを後で使う人を信頼していないわけではないのだけれど、情報漏洩につながるかもしれないことは極力避けたいものです。
本来ならば、システムの再インストールから行えばいいことであり、実際そうすべきなのですが、初期状態に戻した後、ドライバをインストールして、さらにはパッチまで当て直すというのは、あまりに手間です。特にMS-Windowsの場合。
まあ、そこまで行かずとも、社外に持ち出すことのあるPCについては、定期的に空き領域をクリアしておきたいものです。さらには、捨てちゃうパソコンであっても、いや捨てちゃうパソコンだからこそ、ディスク破壊や再フォーマットなどのよけいな手間をかけたくないということもあるでしょう。OSの上から空き領域をクリアできれば、それに越したことはない。
また、中古で売り飛ばす場合、機器が故障してないのを証明するためにOSは生かしたままディスクの空き領域だけをきれいにしたいという必要性も考えられます。
ついでにいうと、ディスクをフォーマット&OS再インストールする場合でも、ディスクに磁気情報は残りますから、あらかじめディスクの空き領域を0で埋め尽くしておくことはそれなりに有効なことでしょう。そういう場合に使えるソフトが無いので、自分で作ることにしました。ただしというか、もちろんというか、MS-Windows用です。
設計しているうちに、この手のツールを誰も作らない理由がよく分かりました。OSが管理できるのはファイルだけ。だからファイルが占有していない空きディスクをどうしよう、というのは無理です。そこで考えました。ディスクの空き領域と同じサイズのファイルを作って、その中を0で埋め尽くせばよいのだ。
しかし、これがまた大変。ディスクの空き領域を求めることはできますが、それと同じサイズのファイルをいきなりアロケートすることはちょっと無理。たとえ出来たとしてもOSが生きていますから、これに悪い影響を与えます。多分、ファイル内部を0で埋め尽くす処理をしている間に、OSがシステムログかなんかを吐くと「ログファイルがいっぱいです」とか文句を言いそうです。最悪システムが落ちます。
1バイトずつファイルに0を吐いてゆき、これ以上書けなくなったら例外処理で捕捉して間髪入れずファイルを削除、という技を考えましたが、これだとものすごいI/O回数になりますから時間がかかって仕方がない。そんなわけで、内部的に1MBのヌル文字の配列を持ち、残り容量が1MBを切るまでは一括して出力、1MBを切ったところで残り容量を再計算して1/2のバイト数のみ出力、さらに残り容量再計算、という仕様にいたしました。
動いているのが分からないと不安ですので、一定量ファイルを書き込む毎に残りバイト数を出力します。(当初は書き込み済みバイト数を出す仕様としていたが、動作中にシステムの使うファイルサイズの増減があるんだな。ネットワークに接続なんかしているとそれはそれは。)
この動作状況の出力というのがまたくせ者で、GUIでやると画面表示がついてこれない。仕方なくコンソールアプリとなりました。
そのほか、ヌル文字を最初String型で持たせていたところ、どういうわけかFileStreamへの出力がうまくいかないとか、ハードディスク容量が大きくなりすぎて32ビット整数じゃオーバーフローしてしまうとか、WindowsAPIのGetDiskFreeSpaceの戻り値がいつの間にかCardinal型に変更されているとか、もう、まんべんなく苦労させていただきました。ディスクの空きエリアに書き込む文字列。よく考えると別に何でもいいのです。「科学は物を巧みに操作するが物に住み着くことは断念している」という高尚な言葉とか、「あんた、こんなところ覗いて、何やってんの?」というディスク情報を読みとろうとしている人をあざけるセリフとかを考えましたが、一番当たり障りのないヌル文字にしました。
同じソフトをMicrosoftが作ったらきっと「インターネットで最もよく使われているワープロはワードです」とでも書き込んだことでしょうが。まてよ、乱数を発生させてそれを書き込んだ方が良かったかな?そうするとさらに慎重を期す人はこのプログラムを例えば3回、繰り返し実行することが出来る。動作速度、まあまあじゃないかな。さすがDelphi。当初はTFileStreamの書き込みはバッファーを使わないので、InSide Delphiという本にある別のクラスを使わないといかんかなあと覚悟していたところ、そう問題ない速度。Borlandが改良したのかな。(少なくともxcopyコマンドで同じサイズのファイルをコピーするよりは速い。)
ただし、バッファーが効くということはプログラムが認識している書き込み済みバイト数と、実際にディスクに書き込まれたバイト数が異なるということですから、空き容量の再計算の問題が発生します。なんてめんどうなんだ。この手のソフト、いつもは多少遅くともvectorに登録を依頼するのですが、どこかすぐに反映してくれるフリーソフトのサイト無いですかね。一刻も早く公開したいのです。理由は二つ。
プログラム名はDiskとScrambleをかけてDiscRambleとしました。え、センスないって?
- 社会的要請:パソコンを捨てるのにまもなくお金がかかるようになる。それまでに捨てたいが故に早急にこのツールが必要な人もいるはずである。
- 個人的要望:もうすぐ二人目の子供が生まれる。上の子の場合は、誕生日に発売された雑誌にたまたま私の作ったフリーソフトが掲載され、何よりの記念になった。ところが最近フリーソフトを発表していないので、今度の子の場合、そういうものができそうもないのでかわいそう。そこでどっかの雑誌社が、これを取り上げてくれないかなあ、と思っている。産まれる月になんとか間に合わせたい。
否定はしないけど。でもRambleには「とりとめのないことを書く」という意味もあります。Diskにとりとめもないこと(無意味な文字列を)書く、という意味もかけているわけですからまあまあということにしてください。もちろん、ソース込みで公開します。公開しないわけにはいけません。使用していないディスク領域の残留磁気まで気にする人が、ソースの公開されていないツールを信用するわけがないじゃないですか。
(2003.8.22 追加)フリーソフト開発秘話、目次へ
上の文をアップロードした2003.8.22未明から深夜までの間は、「ダウンロードはこちら」などと表記しておりましたが、これは当方のミスです。
とりあえずhttpプロトコルで何とかダウンロードできるようにと考えたのですが、失敗しました。ごめんなさい。
それともう一つ、アップロードできない理由があったのです。公開する前に改善せねばならないところがあったのです。このプログラムを書くときは「パソコンの使い回しをする前にハードディスクの空き領域をクリアする」という用途を想定していました。しかし、別の使われ方をする場合があることに気がつきました。フロッピーの使い回しをするときです。
通常は使い回す前に、フロッピーをフォーマットしますが、これでは不十分です。フロッピーディスクにもやはり残留磁気の問題があるからです。(残留磁気があるから、アンフォーマットなんかもできるわけです。)ならば当然、フォーマットした後、ディスクをヌル文字で埋め尽くすことを考えなければなりません。このプログラム、この用途に使えるんじゃないかしら。MS-Windowsの配下で空き領域をクリアするというこのプログラムの仕様は、中途半端といえば中途半端です。しかし、この用途にはジャストフィット。一時期ほどではないとはいえ、まだまだフロッピーは使われています。
で、実験してみたら、十分すぎるほど実用になることが判明しました。クイックフォーマットした後、本プログラムでディスク全域をクリアする方が、ただフォーマットするよりもずっと早く終わるのです。しかしフロッピーのクリアに使うのであれば、それなりの対応をしなければならない。つまり、フロッピードライブをクリアするように指定した場合、「フロッピーが実際に刺さっているか」処理開始前に確認しなければならない。
だからもうちょっと待ってくださいな。>ひょっとして待ってらっしゃる方。よし、これで「おまえがおなかの中にいたとき、パパはこんなものを作っていたんだよ」と胸を張って言えるぞ。もっとも「パパ、フロッピーってなあに?」と返される可能性が極めて高いのですけど。