/ dev / urandom可以替代吗?


21

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

猫/ dev / urandom> / dev / sdb

随机设备是“太”安全的,不幸的是太慢了。我知道有一些wipe用于安全删除的工具,但我想Linux中也有一些工具。


相当于在计算器上:stackoverflow.com/questions/841356/...
大卫ž


1
dd这样做不是更好的方法吗?可能是UUoC奖的竞争者吗?
汤姆·奥康纳

Answers:


12

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

如前所述,/ dev / * random设备旨在用作少量随机数据的来源。


1
根据手册页,“ shred”使用/ dev / urandom。因此,尽管擦除磁盘是一个很好的答案,但它不会比从/ dev / urandom读取的任何其他技术提供加速。(如果使用“切细”,另一个提示是:大多数人可能会更满意1-2次传球,而不是庞大的默认计数,这样擦拭就不需要几天。)
gojomo 2010年

4
其实切丝是比的/ dev / urandom的速度更快。我的猜测是它使用/ dev / urandom或/ dev / random作为种子来提供自己的伪随机数据。
thomasrutter 2011年

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

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


谢谢您的出色回答,我使用/ dev / urandom可以将9.5 MB / s的速度提高到使用openssl可以超过120 MB / s的速度。
GDR 2012年

除了第一个声明Linux对urandom的实现不好的说法外,我赞成这个答案。足以在加密之前擦除(或填充?)硬盘。
Vikrant Chaudhary

5
通过pv一个不错的进度指示器。openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | pv -pterb > /dev/sdb
2013年

当然,@ VikrantChaudhary urandom会产生高质量的伪随机数,但这并不是缓慢的借口。AES计数器模式要快得多,而且很难说它比/ dev / urandom安全得多。
英仙座

1
我想补充的pv建议,你可以管pv -pterb -s $(blockdev --getsize64 /dev/sdb) >/sdbpv显示你对完成写入进度。
asciiphil 2014年

7

在具有T2500 CPU的Thinkpad T60p上的Ubuntu 8.04下的快速测试中,来自1GB的随机数据的openssl rand速度是的3-4倍/dev/urandom。那是,

time cat /dev/urandom | head -c 1000000000 > /dev/null

...大约是4分钟...

time openssl rand 1000000000 | head -c 1000000000 > /dev/null

...刚刚超过1分钟。

不确定随机质量是否存在差异,但是对于高清擦除而言,两者都可能很好。


5

我看到很多答案说使用随机数据并不重要。如果您要做的只是擦除驱动器,那几乎是正确的,但是如果您准备擦拭磁盘以准备磁盘加密,那么就不那么了。

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

Linux硬盘加密设置


1
很好 使用相对较新的磁盘(> 20 GB),任何一次覆盖都可以擦除。即使是NSA之类的产品,也很难从驱动器中获取大量数据。而且非常昂贵。认为每兆字节$ 100.000。关于加密的说法是非常正确的。您希望磁盘的未使用部分看起来像已使用部分一样“随机”。
托尼

您的设备加密软件不会将整个磁盘随机化吗?
弥敦道(Nathan Garabedian)2012年


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

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



2

您的工具越快,结果的安全性就越差。产生良好的随机性需要时间。

无论如何,您可以使用类似dd if = / dev / zero of = / dev / sdb之类的东西,但是显然这不会是随机的,它只会擦除得更快。

另一个选择是使用此方法/ sbin / badblocks -c 10240 -s -w -t random -v / dev / sdb,它比urandom更快,但是badblocks PRNG的随机性较低。


1
老实说-这是驱动器的充分安全保障
沃伦

像切分一样,多次覆盖比一次“完全”随机数据覆盖要花费时间并提供更好的安全性。
暂停,直到另行通知。

“您的工具越快,结果将越不安全。生成良好的随机性需要时间。” - 这不是真的。与/ dev / urandom相比,AES计数器模式(伪)随机数生成器的分析效果要好得多,数量级要快。(请参阅Tronic的答案。)
英仙座

2

/dev/random 使用大量的系统熵,因此仅产生缓慢的数据流。

/dev/urandom 安全性和安全性较低,但速度更快,但仍适用于较小的数据块-并不意味着提供连续的高速随机数流。

您应该制作自己设计的PRNG,并使用/dev/random或播种/dev/urandom。如果需要更多随机性,请定期播种-每隔几MB(或prng的长度如何)。从urandom或random中获取4个字节(32位值)足够快,您可以每1k数据执行此操作(每1k重新设置prng),并获得非常随机的结果,同时运行非常非常快。

-亚当


7
很少有人能编写自己的随机数生成器,该生成器好于已经可以使用的随机数生成器。结果往往是可预测的模式和错误的安全感。我建议通过驱动器的/ dev条目或非常彻底的物理破坏在驱动器上使用切丝。
暂停,直到另行通知。

我同意。我会使用shred,默认情况下会使用urandom(坦率地说,我发现它并不慢)。注意,如果您非常有耐心,可以将/ dev / random与shred一起使用(通过指定--random-source = / dev / random)。
马修·弗拉申

2

如果要快速擦除硬盘驱动器,请向其中写入非随机数据。这与使用随机数据一样安全。无论哪种方式,当连接到计算机时,原始数据都无法读取。覆盖硬盘数据:巨大的争议表明,原始数据也无法使用显微镜读取。


2

用LUKS格式化,并在加密卷上dd。然后使用/ dev / urandom擦除LUKS标头。

如果您具有硬件AES支持,那么这是一个非常快速的解决方案。

简要地:

cryptsetup luksFormat /dev/sdX
cryptsetup luksOpen /dev/sdX cryptodev
dd if=/dev/zero bs=1M of=/dev/mapper/cryptodev
cryptsetup luksClose cryptodev
# wipe the luks header.  Yes, it uses /dev/urandom but only for 2MB of data:
dd if=/dev/urandom bs=1M count=2 of=/dev/sdX

完成了!

查看我的博客: 快速用随机位填充磁盘(不带/ dev / urandom)


如果您只想覆盖设备,为什么还要打扰LUKS?普通dm-crypt(cryptsetup的“纯模式”)更易于使用。
英仙座

2

如果要擦除硬盘驱动器,则dd不会删除重新分配的扇区的内容,如果硬盘驱动器快要死了,它将非常慢。相反,您可以使用驱动器内置的擦除功能,该功能已经标准化很长时间了。

在此示例中,我仅需102分钟即可擦除500GB机械硬盘。即使充满了重新分配的扇区:

root@ubuntu:~# hdparm --security-set-pass Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_SET_PASS command, password="Eins", user=user, mode=high
root@ubuntu:~# time hdparm --security-erase-enhanced Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_ERASE command, password="Eins", user=user

real    102m22.395s
user    0m0.001s
sys     0m0.010s

root@ubuntu:~# smartctl --all /dev/sdaj | grep Reallocated
  5 Reallocated_Sector_Ct   0x0033   036   036   036    Pre-fail Always   FAILING_NOW 1327 

您可以在ata.wiki.kernel.org上看到更多详细信息,但是他们的示例未使用--security-erase-enhanced,这对于删除前面提到的重新分配的扇区是必需的。


1

实际上,可能不需要从一个连续的随机流播种整个磁盘。

您可以创建大小适中的随机数据块,然后在磁盘上一遍又一遍地重复。

只需确保该数据块不是磁盘正常块大小的倍数即可,以确保最终不会用完全相同的随机数据位覆盖相关的数据块。块大小是大约1MB范围内的质数,应该做得很好。

为了提高安全性,只需再执行几次,每次使用不同的块大小即可。


1

“ shred”实用程序既简单又快速。如果驱动器的SMART属性指示零重新分配的扇区,则“切碎”可能足够安全。

但是,如果驱动器已重新分配了扇区,则损坏的扇区上数据将不会被覆盖。如果损坏的位置在重新分配之前包含敏感数据,则“切碎”可能不够好。可以通过重置驱动器的分配图并(反复)读取它们来读取“坏”扇区。

重置不良扇区分配图的能力因制造商和驱动器型号而异。


0

如果您要做的只是覆盖磁盘,那么使用什么都没关系,因为任何事情都会胜过法医实验室的工作,而且我不信任任何将驱动器停下来停止该级别资源的工作。

只需使用非随机来源(如全零或全零)或重复模式(如(我认为这会起作用))

(head -c 4096 /dev/urandom; cat /dev/sdb/) > /dev/sdb

可能是这样,但是有时您不能说服管理层,鉴于两种情况下恢复数据所需的技术水平相同,因此随机写入所赋予的安全性实际上并不比使用全零大。在这种情况下,通常最好通过构建自己的快速随机数生成器来满足要求。
亚当·戴维斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.