嵌入式系统的“唯一性”/熵的来源

时间:2010-09-21 22:29:44

标签: random embedded uniqueidentifier entropy

我有一个嵌入式系统。我在启动或重置时要做的是生成一个唯一的ID,以便在不同的重启时生成一个不同的唯一ID,概率很高。

它无法访问实时时钟,但可以访问ADC和UART。我想知道是否有一种不错的方法从这些来源收集熵以生成唯一的ID。我对Yarrow模糊不清。有一个很好的方法来使用它吗?

不幸的是,我没有任何可预测特征的噪声源; ADC连接到许多相对低噪声的输入,因此我想我可以使用ADC的最低有效位作为输入。

编辑:这是TI TMS320F28335处理器。


更新/澄清:我正在寻找一种收集熵的软件方法。我找到了解决问题的另一种方法,所以在某种程度上,我的问题是一个没有实际意义的问题,但我仍在寻找有关 特定软件解决方案的指导,以便从中收集熵 低熵源,如ADC的最低有效位和接收UART字符的系统时序。

5 个答案:

答案 0 :(得分:11)

我用过:

  • 浮动ADC输入的最低位,但您触及了

  • 一个极高分辨率的定时器(~10ns),当用户按键之间的定时时,它取最低的“n”位。如果您接受用户按键(在最高时间分辨率下)在时间上是有效随机的,那么它的效果非常好。

您还可以计算网络数据包之间的时间等等,但这些可能比很多人的事情更具确定性/可预测性。电噪声和用户交互是更好的熵源。

顺便说一句,关于“按键之间的时间”的东西,我倾向于将这些存储在开机时从嵌入式系统开始,在最后8个左右的循环缓冲区中,因为你永远不知道你什么时候开始需要它们。 (换句话说:不要等到你需要随机位,然后强迫用户按下按钮3次!)

答案 1 :(得分:3)

取决于:

  • 你想要多大程度的独特性?
  • 有非易失性存储吗?
  • 你需要多久才能得到答案?

如果您有闪存/ NVRAM /磁盘,请读取随机种子,递增它并将其写回。如果您不需要设备/刷新/ NVRAM电池耗尽之间的唯一性,种子可以是一个简单的计数器。如果你想要唯一性,那么一旦你收集了“足够的”熵,就重写种子。

(显然你可能想要做其他事情,如果你使用闪光灯,而你的闪光灯控制器没有磨损平衡,或实施自己的磨损平衡。)

如果不这样做,那么从所有来源收集熵,,只有在你有足够的熵后才生成UUID Zvi Gutterman (2006)注意到OpenWRT唯一的熵源是网络访问,很容易被观察到。

使用ADC输出似乎是明智的,有一些简单的指导原则:

  • 使用所有位(或至少比熵估计更多的位),但保守地增加熵估计值。
  • ADC输出在剪切时具有零熵(并且在几乎剪切时可能具有低熵)。

测量输入上的噪音量。我怀疑你每个样本至少会得到一点。然后散列您的位并生成版本4 UUID。

答案 2 :(得分:2)

另见Fortuna,由Niels Ferguson和Bruce Schneier在 Practical Cryptography 中描述。虽然,Yarrow和Fortuna都可能对嵌入式系统来说太重了。

与Yarrow不同,Fortuna不要求您估算随机来源的熵。

答案 3 :(得分:1)

我做了一些similar to Dan's answer。我在非易失性存储器中有一个缓冲区,在用户击键之间使用高分辨率计时器(20ns),包含最后256次击键时间。然后,我计算一个32位CRC,以便在每次系统上电时获得唯一的编号。某些没有用户交互的版本测量了串口上收到的消息之间的时间

这些唯一编号在网络上用作节点标识符,重复项从未出现过任何问题。

后来增加了一个DS2401,它提供了一个持久但唯一的ID,但这只适用于您,如果您可以更改硬件。

答案 4 :(得分:0)

上述Dan的回答中的一小部分......如果您的系统包含某种无线电,您可以读取RSSI。