使用以下命令生成10长度的字符串所需的时间是可以接受的。
cat /dev/urandom | strings -n 10 | head -n 1
而生成一个长度为 255 的字符串则需要很长时间。
cat /dev/urandom | strings -n 255 | head -n 1
我尝试过其他长度,比如 30。它比 10 花费的时间长得多。我多次比较了所消耗的时间。这是为什么?
答案1
对于给定的每个文件,GNU
strings
都会打印至少 4 个字符长(或使用下面选项给出的数量)且后跟不可打印字符的可打印字符序列。
strings
遇到 255 的几率是多少连续的随机流中的可打印字符数?很低,除非您等待足够长的时间。
以下命令不需要输入流中连续的可打印字符。它会清除不可打印的字符。
< /dev/urandom tr -dc '[:print:]' | head -c 255
注意:GNUtr
每次处理一个字节(它没有多字节字符的概念);然后 GNUhead -c
计算字节数。因此:
Ł
使用 GNU 工具时,您将无法从上述命令中获得任何可打印的非 ASCII 字符(例如);- 与非 GNU 实现
tr
(比较这个答案)你可能会在恰好 255 个字节中得到少于 255 个字符; - 使用非 GNU 实现的
tr
最后一个字符可能无效;如果head
在多字节字符中间切断流,就会发生这种情况。
答案2
如果您想要快速获得大量的“随机性”,您可能考虑不/dev/urandom
直接使用,而是使用带有随机密钥的普通 dm-crypt 设备。
它非常适合覆盖设备,但将它与固定长度的文件相结合,您可以获得固定长度的随机数据而无需等待/dev/urandom
。
(虽然你的主要问题似乎是在等待连续的字符strings
,但这仍然很有用且更快,解决了你的“主题行问题”)
以下是相关部分cryptsetup 的常见问题:
2.19 如何使用加密级随机性擦除设备?
如果你不想只进行零擦除,那么传统的建议是使用类似
cat /dev/urandom > <taget-device>
在一台快速计算机上,速度为 10-20MB/s,非常缓慢且痛苦。使用 cryptsetup 和带有随机密钥的普通 dm-crypt 设备,速度会快得多,并且能提供相同级别的安全性。默认值已经足够了。
对于设备设置,请执行以下操作:
cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped
这会将容器以纯文本形式映射到 /dev/mapper/to_be_wiped 下,并使用随机密码。对于实际擦除,您有多种选择。简单擦除,无进度指示器:
cat /dev/zero > /dev/mapper/to_be_wiped
dd_rescue 的进度指示器:
dd_rescue -w /dev/zero /dev/mapper/to_be_wiped
我的“wcs”流量计的进度指示器(可从 http://www.tansi.org/tools/index.html):
cat /dev/zero | wcs > /dev/mapper/to_be_wiped
或者使用简单的“dd”,它会在发送 SIGUSR1 时显示进度,请参阅 dd 手册页。
删除最后的映射就完成了。
因此创建一个名为 10 的固定长度文件,例如 10M
fallocate -l 10M 10
在 10 上设置普通的 dm-crypt,命名为/dev/mapper/crypt10
cryptsetup -v open --type plain -d /dev/urandom 10 crypt10
现在用加密级随机性“覆盖” 10 (使用dd
)并关闭映射
dd if=/dev/zero of=/dev/mapper/crypt10
cryptsetup -v close crypt10
现在,您可以在文件 10 中使用 10M 的随机数据,或者使用 Kamil 的答案删除所有不可打印的字符:“将整个文件”翻译为名为 10-printable 的可打印文件将是
tr -dc '[:print:]' < 10 > 10-printable
在10-printable中留下了大约3.8M的可打印数据。