有没有 /dev/urandom 的替代方案?

cgp*_*cgp 21 security linux

有没有比 /dev/[u]random 更快的方法?有时,我需要做这样的事情

猫 /dev/urandom > /dev/sdb

随机设备“太”安全,不幸的是太慢了。我知道有wipe类似的安全删除工具,但我想在 Linux 中也有一些内置的方法。

Tro*_*nic 24

不幸的是,Linux 对 urandom 的实现很糟糕。如果您的 CPU 支持 AES-NI(硬件加速),您可以使用带有随机密钥的 aes256-ctr 并每秒获得数百兆字节的伪随机性。我也期待 urandom 切换到现代方法。

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

这只小狗在我的盒子上运行 1.0 GB/s(与 /dev/urandom 的 14 MB/s 相比)。它仅使用 urandom 来创建随机密码,然后使用该密钥对 /dev/zero 进行非常快速的加密。这应该是一个加密安全的 PRNG,但我不会做出保证。

  • 通过 `pv` 获得一个不错的进度指示器。`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 -pterb &gt; /dev/sdb`。 (5认同)

Mik*_*eyB 12

如果您想对硬盘驱动器(或文件)进行“安全”擦除,则应该查看 shred 实用程序。

正如之前的海报所指出的,/dev/*random 设备旨在用作小块随机数据的来源。

  • 实际上 shred 比 /dev/urandom **快得多**。我的猜测是它使用 /dev/urandom 或 /dev/random 作为种子提供自己的伪随机数据。 (4认同)

小智 7

在配备 T2500 CPU 的 Thinkpad T60p 上在 Ubuntu 8.04 下进行的快速测试中,来自 1GB 的随机数据openssl rand/dev/urandom. 那是,

time cat /dev/urandom | head -c 1000000000 > /dev/null
Run Code Online (Sandbox Code Playgroud)

...大约 4 分钟,而...

time openssl rand 1000000000 | head -c 1000000000 > /dev/null
Run Code Online (Sandbox Code Playgroud)

……才1分钟多一点。

不确定随机质量是否存在差异,但对于 HD 擦除来说,两者都可能没问题。


小智 5

我看到很多答案说使用随机数据并不重要。如果您尝试做的只是擦除驱动器,那么这几乎是正确的,但如果您正在擦除它以准备磁盘加密,则情况并非如此。

如果您用非随机数据填充设备,然后在其上放置一个加密分区,您可能会遇到问题。驱动器中存储加密数据的部分将从驱动器的其余部分中脱颖而出,因为加密数据看起来是随机的,而其余部分则不会。这可用于确定有关可用于破解它的加密磁盘的信息。下面的链接解释了一些更常见的攻击如何工作以及如何防御它们(无论如何在 Linux 上)背后的理论。

Linux 硬盘加密设置


小智 5

如果您需要安全擦除 HD,有一个非常强大的工具: DBAN


Per*_*ids 5

如果你想擦除一个巨大的块设备,那么我发现它更健壮,使用dd设备映射器而不是随机数据的输出重定向。下面将映射/dev/sdb/dev/mapper/deviceToBeErased加密和解密之间的透明。为了在加密端填充设备,将零复制到映射器 ( /dev/mapper/deviceToBeErased)的纯文本端。

cryptsetup --cipher aes-xts-plain64 --key-file /dev/random --keyfile-size 32 create deviceToBeErased /dev/sdb
dd if=/dev/zero of=/dev/mapper/deviceToBeErased bs=1M
Run Code Online (Sandbox Code Playgroud)

/dev/sdb如果AES没有严重的弱点,则保证加密数据与随机数据无法区分。使用的密钥是从/dev/random(别担心 - 它只使用 32 个字节)中获取的。