Hard-Drive

將隨機數據寫入硬碟的隨機扇區

  • February 2, 2020

我有一個壞了的硬碟,在我將它送去 RMA 之前,我想盡可能多地擦除它。我嘗試使用 Windows 實用程序,還做了 /dev/random 的 dd。問題是我不能等待這些解決方案中的任何一個完成,因為 RMA 的原因是它以 1 MB/秒的最大速度寫入。單次通過 500GB 硬碟就需要 140 多個小時。

我一直在尋找一個實用程序(甚至是 linux 上的 bash 腳本),它可以隨機選擇扇區並將隨機數據(甚至零)寫入這些扇區。我希望如果我執行 24 小時,這將擦除大約 80 GB 的數據。由於它是隨機選擇的,所有較大的文件將無法恢復,較小的文件將被擦除、失去塊或可能可恢復。不幸的是,目前這對我來說是最佳解決方案。

解決方案

多虧了“evildead”,我才能夠從 /dev/urandom 中獲得大量隨機填充垃圾的驅動器數據。bash 腳本,以防有人需要它,如下所示:

#!/bin/bash
while (true); do
   randnum=${RANDOM}${RANDOM}
   number=$((10#$randnum%976773168))
   echo -e $number >> progress.txt
   dd if=/dev/urandom of=/dev/sdx1 skip=$number count=1
done

您需要將 976773168 替換為驅動器上的塊數。我最初嘗試過 $ RANDOM in bash, but it is only a 16-bit int and therefore is only 32k. As I needed a number that is over 900 Million I combined two $ 隨機值,例如,如果我的隨機數是 22,861 和 11,111,我會得到 2,286,111,111,然後將其擬合到我的塊大小,我會在我的範圍內得到一個相當隨機的值。它沒有完美的熵,但話又說回來,電腦上真正隨機的是什麼?;) 如果第一個隨機數是 0,則 10# 存在,它強制 bash 使用基數 10,而不是基數 8,如果它認為該數字是八進制數(前導零),則使用它。我還將隨機數寫入文件以供稍後分析,以查看價差是多少。如果你不需要這個,你可以拿出

echo -e $number >> progress.txt

它會執行良好。另外不要忘記將sdx1替換為您要處理的實際驅動器或分區。我希望這對某人有幫助,我知道這對我真的很有幫助。

您可以將 shellscript 與 dd 結合使用。

例如

while (true); do
  number=$((($RANDOM * 32768 + $RANDOM)))
  dd if=/dev/urandom of=/dev/sdx1 seek=$number count=1
done

您只需修改從 $RANDOM 生成的數字以適合您的塊。

編輯 2016:請注意,舊的解決方案不正確。因為我們想覆蓋輸出流中隨機位置的一個字節,所以我們必須使用 seek 而不是 skip,如評論中所述。

我的系統沒有損壞,寫入/dev/random速度約為 650Kb/s。寫入/dev/urandom速度為 7Kb/s。

我已經為自己解決了這個問題,對於一個純粹的 bash 解決方案,你必須對你的目標是現實的,因為除非你的目標是學習如何在 bash 中做到這一點,因為重點是在 bash 中做這一切,目標儘管 bash 在解決方案中很有用,但可以通過其他方式更好地安全地擦除磁碟。

evildead 的 bash 算法隨機選擇 dd 將寫入驅動器的位置但是,/dev/urandom 比 /dev/random 慢得多,我認為用大塊隨機數據填充驅動器不太安全,我認為它會是如果您快速執行兩次將一個然後零寫入其中的過程,則更難從已擦除的驅動器中檢索數據。

對於我自己,我用以下方式將它們寫到驅動器中:

tr '\0' '\377' < /dev/zero | pv > /dev/sdz

然後我將零寫入驅動器:

pv < /dev/zero > /dev/sdz

注意使用光伏。這是一個很棒的程序,儘管您必須在大多數係統上安裝它。很容易找到,似乎沒有手冊頁,但有一個線上手冊。它顯示了數據通過管道的進度,使用某些程序,您甚至可以將其設置為在傳遞一定數量的數據後停止。

然後純粹是因為我很生氣,因為沒有 bash 解決方案會像上面的任何一個那樣快速寫入隨機數,所以我編寫了一個名為 svrandom 的小 C 程序來快速生成隨機數,我從 bash 呼叫如下:

while :; do ./svrandom; done  | pv > /dev/sdz

在我的系統上,用隨機數填充驅動器 /dev/sdz 的速度與寫入 /dev/zero 一樣快。實現了用隨機數擦除驅動器的目標,並在解決方案中使用了 bash。

/* svrandom
a small program from shadowvision.com September 2015 to generate strings of random numbers.
the default setting of 10000000 gives about 453 megs, adjust as 
needed */ 

#include <stdio.h>
#include <stdlib.h>
int main()
{
int r,a,b;
/* adjust following number as needed to suit your string length */
for(a=0;a<10000000;a++)
{
for(b=0;b<5;b++)
{
r=rand();
printf("%d",r);
}

}
return(0);
}

在我提到的原始碼中,您可以通過調整數字來控制隨機數字元串的長度。如果您從 while 循環中呼叫它,則不必這樣做,儘管每個循環結束時可能會有一個輸入,但是如果您只需要程序中的一個連續字元串,則必須更改數字。

剪斷!環顧四周,我在https://superuser.com/questions/19326/how-to-wipe-free-disk-space-in-linux上找到了這個解決方案

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero |pv > /dev /sd{x}

就像那裡的人說的那樣,我不敢相信這有多快。它寫入磁碟的速度比我想像的磁碟最大寫入速度要快。

在我看來,這個命令使用 openssl 來加密 /dev/zero 中的一串零,使用 /dev/urandom 作為種子,但我不是 100% 確定。我使用 C 程序編寫隨機數的解決方案以 82mbps 寫入我的系統,這個 openssl 解決方案以 100mbps 寫入。哇!

引用自:https://serverfault.com/questions/86914