当安全擦除磁盘时,我如何使用dd进行“位级补足”?(还是使用其他UNIX工具?)
发布于 2013-12-10 10:59:21
我首先要说的是,按位补充磁盘并不是一个安全的擦除,因为如果有人知道您做了什么,他们所要做的就是逆转进程,将磁盘恢复到它原来的状态。
虽然bash
有一个补码运算符,但我不认为它可以在这里使用,因为如果没有其他工具,就无法处理原始字节。
下面是一个简短的C程序,它将作为一个按位补充的管道:
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#define BUFSZ 4096
int main (void) {
unsigned char buffer[BUFSZ];
int i, check;
uint64_t total = 0;
while ((check = read(0, buffer, BUFSZ)) > 0) {
for (i = 0; i < check; i++) buffer[i] = ~buffer[i];
write(1, buffer, check);
total += check;
}
fprintf(stderr, "Bitcomp processed %lu bytes.\n", total);
return 0;
}
汇编如下:
gcc whatever.c -o bitcomp
然后:
dd if=something | ./bitcomp | dd of=something conv=notrunc
当写入正在读取的同一文件时,conv=notrunc
(不截断)是必需的。你可能不需要它作为一个设备。您还可以使用:
./bitcomp < something 1<> something
其中1<>
充当了>
的“无截断”版本(谢谢Stephane Chazelas)。注意,程序报告到标准错误(外壳的描述符2),所以不要重定向2>&1
等。
如果您想了解我所说的可逆的意思,请在文本文件上运行它,然后在相同的文本文件上再次运行它。它将回到它开始的方式。
发布于 2013-12-10 11:42:07
我想我会跳过尝试用dd
自己来做这件事,而去寻找提供这些类型特性的实际工具。我熟悉的4种工具可以这样做:
在这4种方法中,我想看看nwipe
,它有各种各样的方法,可以安全地从磁盘和/或分区擦除数据。我也可能会去看BleachBit。
注意:nwipe
可以从ncurses或直接从命令行运行。
摘自nwipe
手册页
-m, --method=METHOD
The wiping method (default: dodshort).
dod522022m / dod - 7 pass DOD 5220.22-M method
dodshort / dod3pass - 3 pass DOD method
gutmann - Peter Gutmann's Algorithm
ops2 - RCMP TSSIT OPS-II
random / prng / stream - PRNG Stream
zero / quick - Overwrite with zeros
您还可以告诉它执行这一操作的次数:
-r, --rounds=NUM
Number of times to wipe the device using the selected method
(default: 1)
$ nwipe -m dod /dev/sda1
如果您查看nwipe
的源代码,您会注意到DoD 7和DoD 3方法都是按位补充的。
DoD 7
char dod [7];
nwipe_pattern_t patterns [] =
{
{ 1, &dod[0] }, /* Pass 1: A random character. */
{ 1, &dod[1] }, /* Pass 2: The bitwise complement of pass 1. */
{ -1, "" }, /* Pass 3: A random stream. */
{ 1, &dod[3] }, /* Pass 4: A random character. */
{ 1, &dod[4] }, /* Pass 5: A random character. */
{ 1, &dod[5] }, /* Pass 6: The bitwise complement of pass 5. */
{ -1, "" }, /* Pass 7: A random stream. */
{ 0, NULL }
};
DoD 3
char dod [3];
nwipe_pattern_t patterns [] =
{
{ 1, &dod[0] }, /* Pass 1: A random character. */
{ 1, &dod[1] }, /* Pass 2: The bitwise complement of pass 1. */
{ -1, "" }, /* Pass 3: A random stream. */
{ 0, NULL }
};
进一步研究这一点,似乎任何声称做DoD 3或7的软件都会执行这种按位的补充,作为这些特殊擦除方法需要执行的一系列传球的一部分。
发布于 2013-12-10 12:51:04
tr
是用于音译字节的工具:
LC_ALL=C tr < file 1<> file '\0-\377' '\377\376\375\374\373\372\371\370\367\366\365\364\363\362\361\360\357\356\355\354\353\352\351\350\347\346\345\344\343\342\341\340\337\336\335\334\333\332\331\330\327\326\325\324\323\322\321\320\317\316\315\314\313\312\311\310\307\306\305\304\303\302\301\300\277\276\275\274\273\272\271\270\267\266\265\264\263\262\261\260\257\256\255\254\253\252\251\250\247\246\245\244\243\242\241\240\237\236\235\234\233\232\231\230\227\226\225\224\223\222\221\220\217\216\215\214\213\212\211\210\207\206\205\204\203\202\201\200\177\176\175\174\173\172\171\170\167\166\165\164\163\162\161\160\157\156\155\154\153\152\151\150\147\146\145\144\143\142\141\140\137\136\135\134\133\132\131\130\127\126\125\124\123\122\121\120\117\116\115\114\113\112\111\110\107\106\105\104\103\102\101\100\77\76\75\74\73\72\71\70\67\66\65\64\63\62\61\60\57\56\55\54\53\52\51\50\47\46\45\44\43\42\41\40\37\36\35\34\33\32\31\30\27\26\25\24\23\22\21\20\17\16\15\14\13\12\11\10\7\6\5\4\3\2\1\0'
或者:
LC_ALL=C tr < file 1<> file '\0-\377' "$(awk '
BEGIN{for (i=0;i<256;i++) printf "\\%o", 255-i}')"
但正如其他人所指出的那样,作为一个安全的擦除,这是没有意义的。首先,它不安全,因为原始数据很容易派生,然后从性能的角度来看,旋转存储效率很低,因为需要读取数据,然后需要查找来重写数据。
https://unix.stackexchange.com/questions/104585
复制相似问题