随机化高清的快速方法?

16 encryption dd random

我已经阅读了有关如何使硬盘驱动器安全加密的信息,其中一个步骤是将随机位写入驱动器,以使加密数据与硬盘驱动器上的其余数据无法区分。

但是,当我dd if=/dev/urandom of=/dev/sda过去尝试使用时,预计 ETA 会在几天之内。我看到了一些关于使用badblocks代替 urandom 的内容,但这似乎并没有多大帮助。我只想知道是否有任何方法可以帮助我加快速度,例如dd我可能缺少的选项或其他内容,或者速度是否只是 HD 的限制。

Gil*_*il' 14

dd if=/dev/urandom of=/dev/sda,或者简单地说 cat /dev/urandom >/dev/sda,不是用随机数据填充磁盘的最快方法。Linux/dev/urandom并不是最快的加密 RNG。有没有 /dev/urandom 的替代方案?有一些建议。特别是,OpenSSL 包含一个更快的加密 PRNG:

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda
Run Code Online (Sandbox Code Playgroud)

请注意,最终是否有改进取决于哪个部分是瓶颈:CPU或磁盘。

好消息是,用随机数据填充磁盘几乎没有用。首先,消除一个常见的神话,在今天的硬件上用零擦除同样好。使用 1980 年代的硬盘技术,用零覆盖硬盘会留下少量的残余电荷,可以用一些昂贵的硬件来恢复;需要使用随机数据进行多次覆盖(“Gutmann 擦除”)。今天,即使是用零进行一次覆盖,也会留下即使在实验室条件下也无法实际恢复的数据。

加密分区时,为了加密数据的机密性,不需要用随机数据填充磁盘。只有当您需要使加密数据使用的空间与未使用的空间无法区分时,它才有用。在非随机容器之上构建加密卷会显示加密卷曾经使用过哪些磁盘块。这对文件系统的最大大小给出了一个很好的提示(尽管随着时间的推移它会变得越来越糟糕),仅此而已。

  • Gutmann 完全是一个神话,我认为实际上也没有为 1980 年代的硬盘做过。具有讽刺意味的是,随着驱动器变得越来越智能,现在您实际上应该使用随机数据来确保驱动器被强制写入,而不是释放扇区(修剪)或压缩数据。零只有在实际写入时才是好的。 (5认同)
  • @Gilles 我在 Ubuntu 13.10 中遇到的问题是 `openssl rand` 似乎对其生成的字节数有上限。如果超过该限制,例如“openssl rand 810000000000”,则不会生成随机输出。仅打印简短的“帮助”文本。我正在尝试随机(几乎)填充 3TB 硬盘。不确定是否有办法让 `openssl` 产生那么多随机字节。 (2认同)

tre*_*mby 7

您可以让 OpenSSL/dev/zero使用随机密码进行加密,从而非常快地提供不错的伪随机数据(如果您的 CPU 支持加速)。

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda
Run Code Online (Sandbox Code Playgroud)

您可以通过管道pv获取进度/预计到达时间。我现在正在运行的命令(在 root shell 中)是:

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M
Run Code Online (Sandbox Code Playgroud)

在遇到与非理性约翰相同的问题之后,我从这个答案中得到了这个想法,他在上面评论了吉尔斯的答案。这将我对新 RAID 阵列的擦除速度从 11?MB/s 提高到大约 300?MB/s,将需要一周的时间缩短到 10 小时。

我要补充一点,你应该能够使用 而不是上面更复杂的语句,但是有一个错误,它只允许产生 16?MB 的输出。(此错误已于 2016 年 1 月提交。)openssl rand #of_bytesopenssl enc ...ssl

而且,根据对这个问题的回答,并继续假设 CPU 是瓶颈,通过openssl在单独的内核上运行多个并行进程,使用 FIFO 将它们组合起来,可以进一步提高速度。

  • 基准测试:`dd if=/dev/urandom`:18MiB/s,`openssl enc`:~180MiB/s,`fio`:169MiB/s,`openssl rand` 不支持 &gt; 754GB。请注意,如果您还想要自动大小计算,请使用:`openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2&gt;/dev/null | base64 )" -nosalt &lt;/dev/zero | pv --progress --eta --rate --bytes --size $(&lt;/proc/partitions awk '$4=="sda" {print sprintf("%.0f",$3*1024)}') | dd of=/dev/sda bs=2M`。请注意,此命令中出现了两次 `sda`。 (3认同)

小智 5

openssl 似乎对我不起作用。我在提供的解决方案中遇到了“未知选项”和其他问题。所以我最终选择了程序 fio。

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
Run Code Online (Sandbox Code Playgroud)

这似乎需要 3 个小时才能在 24 个 HDD 上实现 19TB。所以大约 1,800 MB/s

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]
Run Code Online (Sandbox Code Playgroud)

我希望这实际上是随机数据。手册页说 fio“默认:用随机数据填充缓冲区。” http://linux.die.net/man/1/fio

我这样做不是为了安全/加密目的,只是想确保我以后的读取测试是实际数据,而不仅仅是 0。同样的 fio 命令可用于 SSD/NVMe 预处理。因为仅使用 /dev/zero 会导致磁盘级压缩“欺骗”实际写入的数量。虽然我会-loops=2为它添加一个标志,但如果它是用于基准测试的新 SSD。

如果您确实希望它是安全的,您可以使用该-randrepeat=bool 选项,因为这将切换“以可预测的方式为随机数生成器播种,以便结果在运行中可重复。默认值:true。”,但我仍然没有确定这将是多么安全。

此外,一些企业级 HDD 有 SED(自加密驱动器),允许您旋转加密密钥以立即安全地擦除所有写入的数据。

最后,我过去曾使用 DBAN(又名 Darik 的 Boot 和 Nuke),它具有 CD 和 USB 可启动选项,并且“是托管在 SourceForge 上的开源项目。该程序旨在安全地擦除硬盘,直到其数据被永久删除已删除且不再可恢复”