shredの安全性について

http://dsas.blog.klab.org/archives/51321653.html
http://d.hatena.ne.jp/jj1bdx/20080919/p1
について

コンテキスト

実はこの日記、社内のMLに投げたメールを、殆どそのままコピペにして公開しちゃったので、コンテキストが完全に抜けてる。既存のshredをそのまま置き換えて良いわけではないので、完全に僕のミス。

会社で廃棄するHDDについては、ちゃんと信頼できる業者に処分を依頼してる。ゴミ箱に捨てたり、中古業者に売ったりはしてない。その上で、業者に引き渡す前に、お手軽に出来る範囲の難読化をすると精神衛生上よろしいという事でshredを使ってる。なので、今回のような手抜きも受け入れられる。

shredの動作について

shredは、数パス(デフォルトでは25)、対象デバイスにビット列を書き込む。書き込むビット列は色々考えられているのだけれども、3以上のパス数を指定した場合、そのうちの3パス分はランダムビット列になる。

CPUが遅いマシンで、/dev/urandomが3MB/sしか出せない場合、500GBのHDDにshredをかけると、randomパス1回当たり46時間強かかる。3パスするとだいたい6日かかる計算になる。「お手軽な難読化」目的にしては、時間がかかりすぎである。

乱数の品質を落とした場合と、それ以外の手抜きをした場合で、どれくらいの難読化になるか

A. dd if=/dev/zero

まず、一番簡単な手抜きが、dd if=/dev/zero。速度はほぼHDDの速度限界まで出る。ただし、残留磁気が綺麗な形で残りそう。HDDを分解して、ヘッドに流れている信号を増幅するだけでデータを復元できてしまいそう。繰り返し実行しても、磁気が弱くなるだけで、データはそのままの形で残りそう。

B. shred -n 1 -z

「重ね書き」をしないようにした場合、shred前のデータによる磁気と、書き込んだ乱数の磁気には強度にかなり差があるから、強い信号を無視し、弱い信号だけを増幅したら、元の情報を復元できそう。

C. 擬似乱数の品質低下

何度も重ね書きした場合、元の情報と1パス目辺りに書いた擬似乱数の磁気情報は混ざってて信号強度による選別はできない。ごちゃ混ぜになったデータから、何かしらパターン(元情報のパターンと擬似乱数のパターン)を発見し、乱数を予測し、それを元に元情報を予測すれば、少しは復元でき…る?

時間について

Aを一回 < Aを数パス ≒ Cを数パス < B

結論

Cが、速くてなおかつ元情報の復元も難しそうなので、精神衛生とお手軽さのバランスでは優れている。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。