由于垃圾收集是不确定的,为什么不将其用于安全随机数生成?


13

我知道/ dev / random是很好的熵来源,并且通常被使用-就像我在GC上阅读一样,至少在Java中,似乎已经接受了垃圾回收守护程序可以不确定地执行。如果是这样,为什么我们不使用垃圾回收的时间作为熵的来源而不是变量/ dev / random?


7
看一下标准C库中rand()函数的一些文档。他们特别要求说,尽管它们给您显示的是随机数,但不能用于安全性。您的典型垃圾收集器可能属于同一类。如果要使用一个安全性,则必须确保使用加密安全的垃圾收集器。
DXM

15
不确定性仍然可以高度预测
棘手怪胎

7
在这种情况下,“不确定性”的描述很差。垃圾收集器是一个完全确定性的系统,如果您完全了解其状态以及使用该程序的程序的状态,则可以确定性地预测结果。
Gort Robot

4
@DXM您知道加密安全垃圾回收器的良好实现吗?;)
AJMansfield

7
“任何考虑产生随机数的算术方法的人,当然都处于犯罪状态。” -约翰·冯·诺伊曼(John von Neumann)
马克·阿德勒

Answers:


58

“未指定”和“随机”是两个完全不同的概念。

没有指定垃圾收集器的确切工作方式,具体取决于垃圾收集器(通常由各种VM实现,但不一定)。

因此,您没有指定的(即确定的)时间来收集垃圾。

但是,任何给定的实现都将遵循一些规则,并且同一程序的两次后续运行都将具有非常相似的垃圾收集模式。

因此,实际的熵由垃圾收集器提供的是非常低的(并找出哪些部分你可以实际使用的熵将是棘手的)。

作为比较:HashMapJava中的A 不能保证对其成员的任何检索顺序(基本上是因为保证它会增加大多数时候不值得支付的开销)。然而对于一个给定的实现和给定一组的插入/清除可以肯定计算由此产生的顺序。仅仅因为不能保证任何给定的顺序,并不意味着该顺序是随机的。


20
我认为这是一个很公平的说法,如果计算机曾经做过实际上不确定的事情,那台计算机就坏了。
Schilcote

非确定性还可能意味着它依赖于手头程序外部的某些状态,该状态本身可能是确定性的,但将与程序本身完全无关,因此每次运行时都可能有所不同。
asmeurer

@asmeurer我认为我在任何这样的背景下都没有听说过这些术语。实际上,我什至不确定您的意思:每个接受外部输入的程序(即最有用的程序)“都依赖于某种外部状态”,但这并不能使它具有不确定性。
us2012

2
@Schilcote:某些现代CPU具有在硬件中实现的不确定RNG。直到量子级物理学,这些都是真正的不确定性。
MSalters

2
@Schilcote即使没有专门的RNG指令(英特尔的RDRAND和RDSEED),计算机也不是完全确定的。某些时间尚未完全指定,可能取决于温度等外部因素。
CodesInChaos

8

首先,我们必须小心,不要被单纯的词语操纵而陷入推理的陷阱。例如,我们可以问一下,既然NFA是“不确定的有限自动机”,为什么不使用它来获得随机数呢?在那种情况下,那是因为那不是NFA中“不确定性”的意思;实际上,当我们在给定的输入上模拟NFA时,模拟行为是完全确定的。

“确定性”是一个加载的短语。对于计算机程序员或计算机科学家而言,不确定性行为仅意味着“确定确切的行为很难考虑”,并且取决于太多因素,包括程序输入。

但是,这并不意味着它对确定性的攻击密码系统的人并不确定。有时可以确定环境因素和投入,而“非确定性”行为会产生可重复的模式。

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.